Добрый день, встречалось у кого нибудь такая проблема, что после загрузки адреса slave функцией
I2C_Send7bitAddress(I2C2, I2C_ADDR_LCD_KEY_LED, I2C_Direction_Transmitter);
он ПЕРИОДИЧЕСКИ не выставляется и соответственно дальше идет зависание на ожидании флага ADDR.
Причем это "периодически" примерно зависит от периода запуска функции Send_data_tread
Код:
while(1){
Send_data_tread(...)
delay();
}
при delay=0 функцию работает при увеличении delay она виснит на какой-то магической цифре, а при дальнейшем увеличении опять работает.
Т.е в рабочей программе это выглядит как 10-700 раз сработала, а потом зависла.
Переписывание функции с работой напрямую с регистрами нечего не дает, результат такой же.
Код:
PT_THREAD(Send_data_tread(struct pt *pt,unsigned char data1,unsigned char data2,unsigned char id)){
static struct pt Init_i2c1;
static unsigned char data[2];
static unsigned char i;
//----------
PT_BEGIN(pt);
PT_INIT(&Init_i2c1);
PT_WAIT_THREAD(pt,I2C_Setup_fsm(&Init_i2c1));
while(1){
Start:
data[0]=data1;
data[1]=data2;
/* initiate start sequence */
I2C_GenerateSTART(I2C2, ENABLE);
/* check start bit flag */
UB_Led_ON(LED_DEBUG_I2C);
while(!I2C_GetFlagStatus(I2C2, I2C_FLAG_SB)){PT_YIELD(pt);};
/*send write command to chip*/
I2C_Send7bitAddress(I2C2, I2C_ADDR_LCD_KEY_LED, I2C_Direction_Transmitter);
i=0;
do{
if(i>30){
//Если адрес всё ещё не отправился то отправляем повторно(через стоп иначе тоже не отправляется).
//Этот костыль спасает, но программа почти регулярно работает через него.
i=0;
UB_Led_OFF(LED_DEBUG_I2C);
goto Start;
}
i++;
PT_YIELD(pt);
}
//Зависает на этом условии на проверки бита ADDR
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/*check master is now in Tx mode*/
//----------
/*mode register address*/
I2C_SendData(I2C2, data[0]);
//----------
/*wait for byte send to complete*/
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)){PT_YIELD(pt);}; //3600 Speed=100Khz
/*clear bits*/
I2C_SendData(I2C2, data[1]);
//----------
/*wait for byte send to complete*/
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)){PT_YIELD(pt);};
//----------
/*generate stop*/
I2C_GenerateSTOP(I2C2, ENABLE);
PT_END_YIELD(pt);
}
PT_END(pt);
//error
}