HAL_ChibiOS: fixed double DMA allocation on i2c

This commit is contained in:
Andrew Tridgell 2018-02-04 16:42:05 +11:00
parent 19e1349d0a
commit 87389e0fdc
2 changed files with 14 additions and 3 deletions

View File

@ -102,7 +102,10 @@ I2CDevice::~I2CDevice()
*/ */
void I2CBus::dma_allocate(void) void I2CBus::dma_allocate(void)
{ {
i2cStart(I2CD[busnum].i2c, &i2ccfg); if (!i2c_started) {
i2cStart(I2CD[busnum].i2c, &i2ccfg);
i2c_started = true;
}
} }
/* /*
@ -110,7 +113,10 @@ void I2CBus::dma_allocate(void)
*/ */
void I2CBus::dma_deallocate(void) void I2CBus::dma_deallocate(void)
{ {
i2cStop(I2CD[busnum].i2c); if (i2c_started) {
i2cStop(I2CD[busnum].i2c);
i2c_started = false;
}
} }
bool I2CDevice::transfer(const uint8_t *send, uint32_t send_len, bool I2CDevice::transfer(const uint8_t *send, uint32_t send_len,
@ -177,8 +183,12 @@ bool I2CDevice::_transfer(const uint8_t *send, uint32_t send_len,
i2cReleaseBus(I2CD[bus.busnum].i2c); i2cReleaseBus(I2CD[bus.busnum].i2c);
if (ret != MSG_OK){ if (ret != MSG_OK){
//restart the bus //restart the bus
i2cStop(I2CD[bus.busnum].i2c); if (bus.i2c_started) {
i2cStop(I2CD[bus.busnum].i2c);
bus.i2c_started = false;
}
i2cStart(I2CD[bus.busnum].i2c, &bus.i2ccfg); i2cStart(I2CD[bus.busnum].i2c, &bus.i2ccfg);
bus.i2c_started = true;
} else { } else {
if (recv_buf != recv) { if (recv_buf != recv) {
memcpy(recv, recv_buf, recv_len); memcpy(recv, recv_buf, recv_len);

View File

@ -34,6 +34,7 @@ class I2CBus : public DeviceBus {
public: public:
I2CConfig i2ccfg; I2CConfig i2ccfg;
uint8_t busnum; uint8_t busnum;
bool i2c_started;
void dma_allocate(void); void dma_allocate(void);
void dma_deallocate(void); void dma_deallocate(void);