Доброго всем дня.
Помогите с программированием I2C
Использую библиотеку HAL, настроим I2C в режиме слейв на работу в двух режимах:
1. Запись данных в регистры;
2. Чтение данных.
Второй режим работает полностью принимает и отправляет данные.
А вот ПЕРВЫЙ режим работы, как мне показалось сложнее, а именно-
при передачи МАСТЕРОМ данных, СЛЕЙВ их принимает через функцию HAL_I2C_Slave_Seq_Receive_DMA и перестает принимать после обнаружения СТОП бита, а вот количество переданных байт МАСТЕРОМ неизвестно, как узнать количество переданных байт. Данные попадают в массив receiveI2C.
Мой код:
Код:
uint8_t transmitI2C[12];
uint8_t receiveI2C[7];
void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
{
if(HAL_I2C_EnableListen_IT(hi2c) != HAL_OK)
{
//Error
}
}
void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode)
{
UNUSED(AddrMatchCode);
if(hi2c->Instance == I2C1)
{
switch (TransferDirection)
{
case I2C_DIRECTION_TRANSMIT:
if (HAL_I2C_Slave_Seq_Receive_DMA(hi2c, receiveI2C, 7, I2C_FIRST_AND_LAST_FRAME) != HAL_OK) //I2C_FIRST_FRAME
{
//Error;
}
while (HAL_I2C_GetState(hi2c) != HAL_I2C_STATE_BUSY_RX_LISTEN); //HAL_I2C_STATE_LISTEN //HAL_I2C_STATE_BUSY_RX_LISTEN
break;
case I2C_DIRECTION_RECEIVE:
if (HAL_I2C_Slave_Seq_Transmit_DMA(hi2c, transmitI2C, 12, I2C_LAST_FRAME) != HAL_OK)
{
// Error here!!! (HAL_BUSY)
//Error;
}
while (HAL_I2C_GetState(hi2c) != HAL_I2C_STATE_BUSY_TX_LISTEN); //HAL_I2C_STATE_READY //HAL_I2C_STATE_BUSY_TX_LISTEN
break;
}
}
}
Добавлено after 32 minutes 23 seconds:Наверное тему надо было создавать в ARM?