ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 сентября
1542919 Топик полностью
Eddy_Em (Сегодня, 15:08, просмотров: 19) ответил Eddy_Em на Странная осциллограмма I2C у STM32F303CBT6.
Странная штука происходит при чтении посредством 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 нет!

В эррате ничего по этому поводу не нашел…

eddy-em.livejournal.com github.com/eddyem