Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 14.12.2012
Сообщений: 86
1

STM32F103VET6 I2C криво принимает в режиме приёма двух байт

14.08.2014, 16:03. Показов 3151. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго дня.
Настраиваю интерфейс 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
}
Для кода используйте тег [code]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.08.2014, 16:03
Ответы с готовыми решениями:

Чтение неск.байт по I2C
Подскажите кодом, как правильно считать несколько байт по y2s. Как один прочитать я понял и...

Организация приема байт на PortB (ASM, ATMega16)
Помогите пожалуйста с кодом. AVRStidio, Ассемблер. Задание Организовать прием семи байт данных...

stm32f4+stmpe811. чтение 4 байт по i2c
Чип stm32f429. Реализовал чтение 1 и 2 байт по y2s, смотрю лог. анализатором - все норм. При чтении...

I2C - не успеваю прочитать байт из буфера
#include &quot;stm32f10x.h&quot; #define MMA_W 0x1D&lt;&lt;1 #define MMA_R (0x1D&lt;&lt;1)|0x01 #define MMA_MCR...

4
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
Во-первых, где в этой функции собственно чтение байта из регистра DR?

Во-вторых, чтение всех байтов серии, кроме последнего, долно быть с ACKом, и только последний (в данном примере второй) байт читается с NACKом. Функция должна делать соответствующее переключение в управляющем регистре, когда чтение последовательности доходит до последнего байта.
Я создаю массив из двух элементов по 8 бит.
После обработки этой функции приёма, последовательно закидывают из регистра сначала первый байт
потом второй. И в 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
Цитата Сообщение от Vlodyslav_Minsk
Вы уверяете, что, вызвав один раз свою функцию EXT_SENSOR_READ_TWO() (которая на деле читает лишь один байт), потом два раз лезете в DR и забираете оттуда два прочитанных байта? Фантастика!

Правильно читают многобайтовые данные за раз по I2C так:
передают в функцию длину считываемых данных (скажем, N) и указатель на массив для данных (у Вас это I2C_BUF);
внутри функции настраивают чтение с ACKом и в цикле читают N-1 раз по одному байту;
потом перенастраивают на режим чтения с NACKом и читают последний байт;
всё, выход из функции.
Да, в 407 именно так и принимается. Для приёма одного байта нужно один статусный бит проверять на заполнение приёмного регистра, а для приёма двух байт проверять завершение передачи байта. Этот кусок я выдрал из одного форума. Всё работает без проблем, как часы. Но в 103 похоже надо как-то иначе. Вот этот кусочек меня и интересует.
0
17.08.2014, 11:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.08.2014, 11:23
Помогаю со студенческими работами здесь

STM32F0 I2C SPL, первый байт...
Подскажите, почему, при указании строки: I2C_TransferHomdling(I2C1, 0x55, 0, I2C_AutoEnd_Mode,...

Эмуляция серийного порта - приема байт для Ардуино
Здравствуйте!Недавно получил контроллер Arduino,сделал пару опытов,и сразу захотел сделать...

I2C, прием заранее неизвестного кол-ва байт.
Всем привет. Подскажите пжлста, как реализовать прием заранее неизвестного количества байт по I2C....

STM32F103 I2C прием не определенного количества байт.
Здравствуйте. Тема I2C в STM32 вроде обсосана и может есть где ответ на мой вопрос, но не нашел...

CVAVR. I2C EEPROM более 256 байт
Возможно, где-то есть ответ, но ничего вразумительного не нашел. Нужно подключить I2C EEPROM на...

i2c eeprom не могу записать больше 256 байт подряд
#define I2C_PORT GPIOB #define I2C_SCL GPIO_PIN_6 /* PB6 ------&gt; I2C1_SCL...

Если команда состоит из двух байт, то как прописать каждый байт отдельно?
Если команда состоит из двух байт , то как прописать каждый байт отдельно? Например , нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru