реклама на сайте
подробности

 
 
> STM32F030 проблема с I2C, Непонятное поведение I2C периферии контроллера
p_kav
сообщение Nov 7 2015, 23:52
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 294
Регистрация: 5-08-14
Из: Ярославль
Пользователь №: 82 466



Здравствуйте.

Использую контроллер STM32F030F4P6. К нему по I2C подключен 1-Wire Master DS2482-100, а к нему, в свою очередь, по 1-Wire подключен термометр DS1820.

В Keil 5 написан следующий код.

Инициализация I2C:

CODE
void i2c1_init(void)
{
GPIO_InitTypeDef PORT;
I2C_InitTypeDef I2C_INIT;

I2C_StructInit(&I2C_INIT);

I2C_INIT.I2C_Ack = I2C_Ack_Disable;
I2C_INIT.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_INIT.I2C_Mode = I2C_Mode_I2C;
I2C_INIT.I2C_OwnAddress1 = 0xAA;
I2C_INIT.I2C_AnalogFilter = I2C_AnalogFilter_Disable;
I2C_INIT.I2C_DigitalFilter = 0;
I2C_INIT.I2C_Timing = 0x20000A0D; // Расчитано в Excel-таблице I2C_Timing_Configuration_V1.0.1.xls от ST

I2C_DeInit(I2C1);

PORT.GPIO_Mode = GPIO_Mode_AF;
PORT.GPIO_OType = GPIO_OType_OD;
PORT.GPIO_PuPd = GPIO_PuPd_NOPULL;
PORT.GPIO_Speed = GPIO_Speed_2MHz;
PORT.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;

GPIO_Init(GPIOA, &PORT);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_4);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_4);

I2C_Init(I2C1, &I2C_INIT);
I2C_Cmd(I2C1, ENABLE);

}


Работа с DS2482-100:

CODE
t1 = 0;
t2 = 0;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) == SET);
I2C_TransferHandling(I2C1, DS2482A_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
I2C_SendData(I2C1, 0xF0);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == RESET);

I2C_TransferHandling(I2C1, DS2482A_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
I2C_SendData(I2C1, 0xB4);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == RESET);

do
{
I2C_TransferHandling(I2C1, DS2482A_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Read);
} while (I2C_ReceiveData(I2C1) & 0x01);

I2C_TransferHandling(I2C1, DS2482A_Addr, 2, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET); // Зависает здесь
I2C_SendData(I2C1, 0xA5);
I2C_SendData(I2C1, 0xCC);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == RESET);

do
{
I2C_TransferHandling(I2C1, DS2482A_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Read);
} while (I2C_ReceiveData(I2C1) & 0x01);

/*
I2C_TransferHandling(I2C1, DS2482A_Addr, 2, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
I2C_SendData(I2C1, 0xA5);
I2C_SendData(I2C1, 0x44);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == RESET);

I2C_TransferHandling(I2C1, DS2482A_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Read);
while(I2C_ReceiveData(I2C1) & 0x01) {}
*/

I2C_TransferHandling(I2C1, DS2482A_Addr, 2, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
I2C_SendData(I2C1, 0xA5);
I2C_SendData(I2C1, 0xBE);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == RESET);

do
{
I2C_TransferHandling(I2C1, DS2482A_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Read);
} while (I2C_ReceiveData(I2C1) & 0x01);

I2C_TransferHandling(I2C1, DS2482A_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
I2C_SendData(I2C1, 0x96);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == RESET);

I2C_TransferHandling(I2C1, DS2482A_Addr, 2, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
I2C_SendData(I2C1, 0xE1);
I2C_SendData(I2C1, 0xE1);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == RESET);

I2C_TransferHandling(I2C1, DS2482A_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Read);
t1 = I2C_ReceiveData(I2C1);

I2C_TransferHandling(I2C1, DS2482A_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
I2C_SendData(I2C1, 0x96);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == RESET);

do
{
I2C_TransferHandling(I2C1, DS2482A_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Read);
} while (I2C_ReceiveData(I2C1) & 0x01);

I2C_TransferHandling(I2C1, DS2482A_Addr, 2, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
I2C_SendData(I2C1, 0xE1);
I2C_SendData(I2C1, 0xE1);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == RESET);

I2C_TransferHandling(I2C1, DS2482A_Addr, 1, I2C_AutoEnd_Mode, I2C_Generate_Start_Read);
t2 = I2C_ReceiveData(I2C1);

while(I2C_GetFlagStatus(I2C1, I2C_ISR_STOPF) == RESET);
I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);


Если данный код вручную прошагать в отладчике, то никаких проблем не проявляется и в переменных t1 и t2 будут 0x05 и 0x50, как и указано в даташите на DS18B20.
Однако при обычном запуске программа зависает на четвертом блоке кода на проверке флага TXIS (отмечено комментарием). Флаг TXIS действительно не установлен, при этом флаг TXE установлен, хотя как я понял из даташита, в данном случае они должны подниматься вместе. Также установлен флаг TC, а NACKF, ARLO и другие сняты.
Если установить Breakpoint на строчку выше (I2C_TransferHandling) и выполнить Step Over, то TXIS будет установлен и работа продолжится.

Перепробовал множество вариантов, итог всегда один - пошагово работает, при обычном запуске виснет на проверке флага. У кого-нибудь было такое поведение I2C периферии STM32F0?

Сообщение отредактировал IgorKossak - Nov 8 2015, 17:52
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- p_kav   STM32F030 проблема с I2C   Nov 7 2015, 23:52
- - etoja   Цитата(p_kav @ Nov 8 2015, 03:52) Использ...   Nov 8 2015, 17:16
- - p_kav   Цитата(etoja @ Nov 8 2015, 22:16) I2C и 1...   Nov 8 2015, 17:36
|- - Alechek   Цитата(p_kav @ Nov 8 2015, 22:36) Всё вер...   Nov 9 2015, 06:45
|- - scifi   Цитата(Alechek @ Nov 9 2015, 09:45) Так, ...   Nov 9 2015, 07:08
|- - adnega   Цитата(scifi @ Nov 9 2015, 10:08) +1. Кст...   Nov 9 2015, 08:04
- - p_kav   Alechek Что-то не могу найти ни одной статьи о так...   Nov 9 2015, 07:04
|- - Alechek   Цитата(p_kav @ Nov 9 2015, 12:04) Что-то ...   Nov 9 2015, 08:05
- - adnega   По теме: флаги под отладчиком могут меняться, если...   Nov 9 2015, 08:07
|- - scifi   Цитата(adnega @ Nov 9 2015, 11:07) По тем...   Nov 9 2015, 08:15
- - p_kav   scifi Я пробовал вставлять задержки, не помогает. ...   Nov 9 2015, 08:28
|- - scifi   Цитата(p_kav @ Nov 9 2015, 11:28) мне каж...   Nov 9 2015, 08:41
|- - AVI-crak   Цитата(p_kav @ Nov 9 2015, 15:28) К тому ...   Nov 9 2015, 09:03
- - p_kav   Цитата(scifi @ Nov 9 2015, 13:41) А ещё п...   Nov 9 2015, 08:47
|- - KnightIgor   Цитата(p_kav @ Nov 9 2015, 09:47) Вот, на...   Nov 9 2015, 10:21
- - vet   Пытался работать с I2C-периферией и на STM32F, и н...   Nov 9 2015, 09:10
- - p_kav   Цитата(AVI-crak @ Nov 9 2015, 14:03)...   Nov 9 2015, 09:13
|- - adnega   Цитата(p_kav @ Nov 9 2015, 12:13) остаетс...   Nov 9 2015, 09:22
- - p_kav   Цитата(KnightIgor @ Nov 9 2015, 15:21) ТС...   Nov 9 2015, 10:33
|- - KnightIgor   Цитата(p_kav @ Nov 9 2015, 11:33) А код о...   Nov 9 2015, 10:50
- - p_kav   А посмотреть можно? Или это коммерческая тайна?   Nov 9 2015, 10:51
- - KnightIgor   RE: STM32F030 проблема с I2C   Nov 9 2015, 11:29


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 18:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016