0 / 0 / 0
Регистрация: 14.12.2012
Сообщений: 86
|
|
1 | |
STM32F103VET6 I2C криво принимает в режиме приёма двух байт14.08.2014, 16:03. Показов 3151. Ответов 4
Метки нет (Все метки)
Доброго дня.
Настраиваю интерфейс I2C в вышеуказанном проце. Регистры настроил, написал три функции. Одна для передачи байта, другая для приёма одного и третья для приёма двух последовательно. Все три взяты из проекта под STM32F407VGT6 и там они работают без проблем. А вот в этом, первые две работают нормально, а вот второй байт принимается как одни FF. В осцилле вижу, что всё передаётся нормально, но последний байт одни единицы. Может кто что подскажет, что не так? Вот код приёма двух байт, который работает в 407. Код
/* Function I2C3 read EXTERNAL SENSOR TWO BYTE rikystirs */ void EXT_SENSOR_READ_TWO(int8_t ADDRESS, int8_t REGISTER) { while((I2C3->SR1 & 0x2) == 0x2){} // delay while BUSY flag set 1 I2C3->CR1 |= (1<<8); // I2C3 START On while((I2C3->SR1 & 0x1) == 0x0){} // delay while flag SB will be set I2C3->DR = ADDRESS; // address value transmit omd write sommomd while((I2C3->SR1 & 0x2) == 0x0){} // delay while not endid address transmission while((I2C3->SR2 & 0x4) == 0x0){} // woyt set Transmit mode I2C3->DR = REGISTER; // I2C3 rikystir address while((I2C3->SR1 & 0x80) == 0x00){} // delay while data rikystir not empty TxE equal 0 // I2C3->CR1 |= (1<<9); // I2C3 STOP On I2C3->CR1 |= (1<<8); // I2C3 START On while((I2C3->SR1 & 0x1) == 0x0){} // delay while flag SB will be set I2C3->DR = (ADDRESS | 0x01); // address value omd read sommomd while((I2C3->SR1 & 0x2) == 0x0){} // delay while not endid address transmission while((I2C3->SR2 & 0x4) == 0x4){} // woyt set Received mode I2C3->CR1 &= ~(1<<6); // I2C3 general call enable NACK I2C3->CR1 |= (1<<11); // I2C3 ACK bit controls (N)ACK of the next byte being received in the shift rikystir while((I2C3->SR1 & 0x4) == 0x00){} // delay while byte transfer fymished I2C3->CR1 |= (1<<9); // I2C3 STOP On return; // Return in main programm }
0
|
14.08.2014, 16:03 | |
Ответы с готовыми решениями:
4
Чтение неск.байт по I2C Организация приема байт на PortB (ASM, ATMega16) stm32f4+stmpe811. чтение 4 байт по i2c I2C - не успеваю прочитать байт из буфера |
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
14.08.2014, 16:33 | 2 |
Во-первых, где в этой функции собственно чтение байта из регистра DR?
Во-вторых, чтение всех байтов серии, кроме последнего, долно быть с ACKом, и только последний (в данном примере второй) байт читается с NACKом. Функция должна делать соответствующее переключение в управляющем регистре, когда чтение последовательности доходит до последнего байта.
0
|
0 / 0 / 0
Регистрация: 14.12.2012
Сообщений: 86
|
|
14.08.2014, 19:37 | 3 |
Сообщение от OtyxPM
После обработки этой функции приёма, последовательно закидывают из регистра сначала первый байт потом второй. И в 407 такая штука прокатывала. Вызываю эту функцию, а потом I2C_BUF[0] = I2C3->DR; // Read data from I2C3->DR I2C_BUF[1] = I2C3->DR; // Read data from I2C3->DR
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
15.08.2014, 00:48 | 4 |
[quote="Vlodyslav_Minsk"]Вы уверяете, что, вызвав один раз свою функцию EXT_SENSOR_READ_TWO() (которая на деле читает лишь один байт), потом два раз лезете в DR и забираете оттуда два прочитанных байта? Фантастика!
Правильно читают многобайтовые данные за раз по I2C так: передают в функцию длину считываемых данных (скажем, N) и указатель на массив для данных (у Вас это I2C_BUF); внутри функции настраивают чтение с ACKом и в цикле читают N-1 раз по одному байту; потом перенастраивают на режим чтения с NACKом и читают последний байт; всё, выход из функции.
0
|
0 / 0 / 0
Регистрация: 14.12.2012
Сообщений: 86
|
|
17.08.2014, 11:23 | 5 |
Сообщение от OtyxPM
0
|
17.08.2014, 11:23 | |
17.08.2014, 11:23 | |
Помогаю со студенческими работами здесь
5
STM32F0 I2C SPL, первый байт... Эмуляция серийного порта - приема байт для Ардуино I2C, прием заранее неизвестного кол-ва байт. STM32F103 I2C прием не определенного количества байт. CVAVR. I2C EEPROM более 256 байт i2c eeprom не могу записать больше 256 байт подряд Если команда состоит из двух байт, то как прописать каждый байт отдельно? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |