Добрый день.
Изучаю работу с STM32F407 с применением HAL-библиотек.
Завис на изучении I2C. Пробую вести обмен с микросхемой CS43L22, которая стоит на плате.
По схеме на плату вижу подключение ног I2C этой микросхемы к пинам PB6(SCL) и PB9(SDA)
Также по схеме вижу их подтяжку к питанию через 4,7 кОм

В STM32CubeMX создал проект и настроил эти пины STM-ки на интерфейс I2C
настроил скорость и параметры пинов (скорость обмена сделал маленькую - 10кГц, но пробовал и 100кГц)
В даташите на CS43L22 нашел циклограмму чтения
и пытаюсь вычитать ИД микросхемы, т.е. регистр с адресом 0х01
CODE
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM6_Init();
MX_I2C1_Init();
LCD_init();
LCD_clear();
HAL_TIM_Base_Start(&htim6);
HAL_TIM_Base_Start_IT(&htim6);
while (1)
{
LCD_clear();
LCD_Cursor(0, 0);
LCD_write_String("BEGIN");
HAL_Delay(1000);
LCD_clear();
LCD_Cursor(0, 0);
aTxBuffer[0] = 0x01;
LCD_clear();
LCD_Cursor(0, 0);
LCD_write_String("Wait ready...");
while( HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY )
{
LCD_clear();
LCD_Cursor(0, 0);
LCD_write_String("Not ready...");
}
HAL_Delay(1000);
LCD_clear();
LCD_Cursor(0, 0);
LCD_write_String("Wait write...");
while(HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)0x94, aTxBuffer, (uint16_t)1, (uint32_t) 1000) != HAL_OK)
{
if(HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
{
LCD_clear();
LCD_Cursor(0, 0); // позиция курсора начинается с 0
LCD_write_String("Buffer ERROR!");
}
}
while( HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY )
{
LCD_clear();
LCD_Cursor(0, 0);
LCD_write_String("..CONTINUE..");
}
LCD_clear();
LCD_Cursor(0, 0);
LCD_write_String("Write OK!");
I2C_ReadBuffer(&hi2c1, (uint16_t)0x94, (uint16_t)1);
HAL_Delay(1000);
}
}
Т.е. я сначала записываю адрес этого регистра 0х01 (использую стандартную ф-цию HAL_I2C_Master_Transmit), затем собираюсь читать (уже использую свою ф-цию I2C_ReadBuffer)...но до чтения прога не доходит, зависает в цикле
while(HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)0x94, aTxBuffer, (uint16_t)1, (uint32_t) 1000) != HAL_OK).
Адрес микросхемы 0х94 - по даташиту.
Находил несколько статей по работе именно с этой микросхемой на этой плате, код примерно такой же. Смотрел видео-пример по работе с часами реального времени, там код вообще совпадает.
Если кто работал с этой микросхемой, подскажите плз, где я мог накосячить? Код минимальный.
Сообщение отредактировал IgorKossak - Feb 7 2018, 14:15
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!