Hi All!
Ive got some problem with kernek, I suppose
I trying to use HAL I2C with restart transmission and non-blocking API
And when I use transmit and then receive I always go into the default handler(infinit loop)
I checked all priorities and My I2C is based on an appropriate STM example
I asked about this on ST community but still unresolve this problem
My code is that:
I2C_HandleTypeDef hi2c1;
osThreadId_t I2CcommHandle;
const osThreadAttr_t I2Ccomm_attributes = {
.name = "I2CComm",
.stack_size = 128 * 8,//4,
.priority = (osPriority_t) osPriorityBelowNormal,
};
void startI2Ccomm(void *argument);
I2CcommHandle = osThreadNew(startI2Ccomm, NULL, &I2Ccomm_attributes);
static void MX_I2C1_Init(void)
{
/* USER CODE BEGIN I2C1_Init 0 */
/* USER CODE END I2C1_Init 0 */
/* USER CODE BEGIN I2C1_Init 1 */
/* USER CODE END I2C1_Init 1 */
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 80000;///100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_16_9;//I2C_DUTYCYCLE_2; //
hi2c1.Init.OwnAddress1 = 0; // не должно быть 0
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;//I2C_ADDRESSINGMODE_10BIT;//I2C_ADDRESSINGMODE_7BIT; //
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0; // не должно быть 0
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if(HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
{
Error_Handler();
}
if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
{
Error_Handler();
}
}
void startI2Ccomm(void *argument)
{
char* out;
uint8_t pointer[8]= {0,1,2,3,4,5,6,7};
uint16_t LTCV, LTCA;
pointer[7] = 0x10;
char LTCT[] = "LTC\r\nCurrent = X.XXX A*\r\nVoltage = XX.X V*\r\nEND_LSN_DATA\r\n"; // 58?
uint8_t addr = 0x00;//((I2C_device_addr)<<3);
addr = ((I2C_device_addr)<<1);
for(;;)
{
if((!(tcpstatus>0x07)) && (tmrstatus == 0x01))
{
pointer[0] =LTC4151_CONTROL_REG;//LTC4151_SENSE_H;
pointer[1] = LTC4151_TEST_MODE;
if(HAL_I2C_Master_Seq_Transmit_IT(&hi2c1, (uint16_t)addr, pointer, 2, I2C_FIRST_FRAME)== HAL_OK)
{
if(HAL_I2C_Master_Seq_Receive_IT(&hi2c1, (uint16_t)addr, pointer, 7, I2C_LAST_FRAME) == HAL_OK)
{
if(pointer[6] == 0x10)
HAL_Delay(20);
}
}
}
}
vTaskSuspend(NULL);
osDelay(10);
}
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *I2cHandle)
{
asm("NOP");
}
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *I2cHandle)
{
asm("NOP");
}
void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode)
{
asm("NOP");
}
void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
{
// uwTransferEnded = 1;
asm("NOP");
}
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *I2cHandle)
{
if (HAL_I2C_GetError(I2cHandle) != HAL_I2C_ERROR_AF)
{
Error_Handler();
}
}
My code
Thus hope you help
Thanks in advance