- Главная
- Форум
- Микроконтроллеры и Системы на Модуле (SOM)
- Микроконтроллеры
- Проблема с аппаратным I2C
Проблема с аппаратным I2C
- Stepanov Ivan
- Автор темы
- Посетитель
11 года 3 мес. назад #4661
от Stepanov Ivan
Stepanov Ivan создал тему: Проблема с аппаратным I2C
Здравствуйте! С модулем I2C работаю НЕ впервые, делал как программную реализацию так и аппаратную, на контроллере stm32f107. Сейчас работаю с контроллером stm32l151, и столкнулся со следующей проблемой: не могу получить бит подтверждения ACK от слейв устройства, а точне, от акселерометра st lis3lv02dl. То есть не совсем не могу, получается следующая странность, пока два раза контроллер не пересбросишь ACK не приходит. Почему - загадка века. Ниже прилагаю код реализации:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Data = 0;
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* Send I2C2 slave Address for write */
I2C_Send7bitAddress(I2C1, SlaveAddress, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, Register);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
//restart
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* Send I2C2 slave Address for write */
I2C_Send7bitAddress(I2C1, SlaveAddress, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
Data = I2C_ReceiveData(I2C1);
/* Send I2C1 STOP Condition */
I2C_GenerateSTOP(I2C1, ENABLE);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Что думаете по этому поводу товарищи? в чем баг? может я чего то не понимаю, или какая то особенность в i2c для данной микрухи? Ткните носом, пожалуйста...
P.S. Все адреса правильные, иначе ack вобще не приходил бы никогда.
P.P.S. Это функция "приветствия" акселерометра, с последующим получением его адреса из регистра WHO_AM_I
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Data = 0;
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* Send I2C2 slave Address for write */
I2C_Send7bitAddress(I2C1, SlaveAddress, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, Register);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
//restart
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* Send I2C2 slave Address for write */
I2C_Send7bitAddress(I2C1, SlaveAddress, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
Data = I2C_ReceiveData(I2C1);
/* Send I2C1 STOP Condition */
I2C_GenerateSTOP(I2C1, ENABLE);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Что думаете по этому поводу товарищи? в чем баг? может я чего то не понимаю, или какая то особенность в i2c для данной микрухи? Ткните носом, пожалуйста...
P.S. Все адреса правильные, иначе ack вобще не приходил бы никогда.
P.P.S. Это функция "приветствия" акселерометра, с последующим получением его адреса из регистра WHO_AM_I
- Денис Ягов
- Посетитель
11 года 3 мес. назад #4679
от Денис Ягов
Денис Ягов ответил в теме Re: Проблема с аппаратным I2C
I2C - это больная тема контроллеров ST.
Читайте ERRATA.
Сами ST рекоммендуют использовать библиотеку CPAL. Она в открытом доступе на странице продукта вкладка "Design resources" [iurl=http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1295/LN962/PF252048?s_searchtype=partnumber#]www.st.com/web/catalog/mmc/FM141/SC1169/...archtype=partnumber#[/iurl]
В ней все erratы обойдены.
Т.е. ваше приложение должно работать с I2C через софтовую "прокладку" в виде указанной библиотеки.
Стоит отметить, что в последних семействах контроллеров STM32F3 и STM32F0 - I2C обновлён (версия интерфейса 3.0). Там нет ограничений.
Как вариант, поищите на форуме (или в новостях) "Квадратному контроллеру 2 квадратные шины" .... это не CPAL, а моя софтина .... вроде работала. Код - выложен в форуме.
Читайте ERRATA.
Сами ST рекоммендуют использовать библиотеку CPAL. Она в открытом доступе на странице продукта вкладка "Design resources" [iurl=http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1295/LN962/PF252048?s_searchtype=partnumber#]www.st.com/web/catalog/mmc/FM141/SC1169/...archtype=partnumber#[/iurl]
В ней все erratы обойдены.
Т.е. ваше приложение должно работать с I2C через софтовую "прокладку" в виде указанной библиотеки.
Стоит отметить, что в последних семействах контроллеров STM32F3 и STM32F0 - I2C обновлён (версия интерфейса 3.0). Там нет ограничений.
Как вариант, поищите на форуме (или в новостях) "Квадратному контроллеру 2 квадратные шины" .... это не CPAL, а моя софтина .... вроде работала. Код - выложен в форуме.
- Stepanov Ivan
- Автор темы
- Посетитель
11 года 3 мес. назад #4684
от Stepanov Ivan
Stepanov Ivan ответил в теме Re: Проблема с аппаратным I2C
Спасибо Денис, уже плюнул на это дело. Запустил акселерометр через SPI и все норм, хотя и пришлось повозиться малость.
Время создания страницы: 0.043 секунд