Странная штука происходит при чтении посредством DMA: читается
"левый" первый байт (в итоге потом остается один в "зависоне").
Пока решил этот косяк костылем: static uint8_t dmard(uint8_t addr, uint16_t nbytes, uint8_t stop){
if(nbytes < 1 || nbytes > I2C_BUFSIZE) return 0;
if(isI2Cbusy()) return 0;
i2cDMAsetup(0, nbytes);
goterr = 0;
i2c_got_DMA = 0;
if(!i2c_startr(addr, nbytes, stop)) return 0;
dma_remain = nbytes > 255 ? nbytes - 255 : 0; // remainder after first read finish
(void) I2C1->RXDR; // avoid wrong first byte
DMA1_Channel7->CCR = DMARXCCR | DMA_CCR_EN; // init DMA before START sequence
I2Cbusy = 1;
return 1;
}
(dma_remain обрабатывается в прерывании по окончании чтения - если нужно больше 255 байт прочитать).
Если строчку `(void) I2C1->RXDR;` убрать, то непонятно откуда читается тот самый "левый" байт. Причем, в момент запуска DMA в регистре ISR бита I2C_ISR_RXNE нет!
В эррате ничего по этому поводу не нашел…