Merge pull request #273 from KarlK90/gd32vf103-i2c-fix
[GD32] Fix I2C Hangups
This commit is contained in:
commit
9dbe061083
|
@ -263,11 +263,8 @@ static void i2c_lld_serve_event_interrupt(I2CDriver *i2cp) {
|
||||||
case I2C_EV6_MASTER_REC_MODE_SELECTED:
|
case I2C_EV6_MASTER_REC_MODE_SELECTED:
|
||||||
dp->CTL1 &= ~I2C_CTL1_EVIE;
|
dp->CTL1 &= ~I2C_CTL1_EVIE;
|
||||||
/* Clear address flags before dma enable */
|
/* Clear address flags before dma enable */
|
||||||
if (event & (I2C_STAT0_ADDSEND | I2C_STAT0_ADD10SEND)){
|
|
||||||
(void)dp->STAT0;
|
(void)dp->STAT0;
|
||||||
(void)dp->STAT1;
|
(void)dp->STAT1;
|
||||||
}
|
|
||||||
dp->CTL1 |= I2C_CTL1_DMAON;
|
|
||||||
dmaStreamEnable(i2cp->dmarx);
|
dmaStreamEnable(i2cp->dmarx);
|
||||||
dp->CTL1 |= I2C_CTL1_DMALST; /* Needed in receiver mode. */
|
dp->CTL1 |= I2C_CTL1_DMALST; /* Needed in receiver mode. */
|
||||||
if (dmaStreamGetTransactionSize(i2cp->dmarx) < 2)
|
if (dmaStreamGetTransactionSize(i2cp->dmarx) < 2)
|
||||||
|
@ -276,11 +273,8 @@ static void i2c_lld_serve_event_interrupt(I2CDriver *i2cp) {
|
||||||
case I2C_EV6_MASTER_TRA_MODE_SELECTED:
|
case I2C_EV6_MASTER_TRA_MODE_SELECTED:
|
||||||
dp->CTL1 &= ~I2C_CTL1_EVIE;
|
dp->CTL1 &= ~I2C_CTL1_EVIE;
|
||||||
/* Clear address flags before dma enable */
|
/* Clear address flags before dma enable */
|
||||||
if (event & (I2C_STAT0_ADDSEND | I2C_STAT0_ADD10SEND)){
|
|
||||||
(void)dp->STAT0;
|
(void)dp->STAT0;
|
||||||
(void)dp->STAT1;
|
(void)dp->STAT1;
|
||||||
}
|
|
||||||
dp->CTL1 |= I2C_CTL1_DMAON;
|
|
||||||
dmaStreamEnable(i2cp->dmatx);
|
dmaStreamEnable(i2cp->dmatx);
|
||||||
break;
|
break;
|
||||||
case I2C_EV8_2_MASTER_BYTE_TRANSMITTED:
|
case I2C_EV8_2_MASTER_BYTE_TRANSMITTED:
|
||||||
|
@ -303,6 +297,11 @@ static void i2c_lld_serve_event_interrupt(I2CDriver *i2cp) {
|
||||||
(void)dp->STAT0;
|
(void)dp->STAT0;
|
||||||
(void)dp->STAT1;
|
(void)dp->STAT1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Errata 2.4.6 for STM32F40x, Spurious Bus Error detection in Master mode.*/
|
||||||
|
if (event & I2C_STAT0_BERR) {
|
||||||
|
dp->STAT0 &= ~I2C_STAT0_BERR;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -582,9 +581,7 @@ void i2c_lld_start(I2CDriver *i2cp) {
|
||||||
/* Reset i2c peripheral.*/
|
/* Reset i2c peripheral.*/
|
||||||
dp->CTL0 = I2C_CTL0_SRESET;
|
dp->CTL0 = I2C_CTL0_SRESET;
|
||||||
dp->CTL0 = 0;
|
dp->CTL0 = 0;
|
||||||
dp->CTL1 = 0;
|
dp->CTL1 = I2C_CTL1_ERRIE | I2C_CTL1_DMAON;
|
||||||
dp->STAT0 = 0;
|
|
||||||
dp->CTL1 = I2C_CTL1_ERRIE;
|
|
||||||
/* Setup I2C parameters.*/
|
/* Setup I2C parameters.*/
|
||||||
i2c_lld_set_clock(i2cp);
|
i2c_lld_set_clock(i2cp);
|
||||||
i2c_lld_set_opmode(i2cp);
|
i2c_lld_set_opmode(i2cp);
|
||||||
|
|
Loading…
Reference in New Issue