Страница 1 из 1

STM32. Датчик AM2321

Добавлено: Чт дек 29, 2016 17:12:40
Radist228
Всем доброго времени суток.Совсем недавно я начал играться с контроллером STM32F407VG и вдоволь намигавшись со светодиодами было принято решение сделать что-то поинтереснее и для этих целей был куплен AM231.И в самом начале общения с ним начались проблемы. В технической документации на датчик сказано что для того чтобы завелся датчик надо подать по шине сигнал, как на картинке
nack.png
(89.38 КБ) 421 скачивание
При попытке повторения данного сигнала получается то, что показано на вот этой картинке
logic.png
(10.01 КБ) 413 скачиваний

Тобишь, при отправке 7 битного адреса выставляется NACK и держится. Как сделать так чтобы у нас выставился NACK и линия SDA ушла в нуль. Пробовал через стандартные функции GPIO_SetBits, GPIO_ResetBits,но все тсчетно. Код программы ниже. Заранее Спасибо. Ну очень прям хочется завести его)

void Init_I2C_1(void)
{

GPIO_InitTypeDef GPIO_I2C_init;
I2C_InitTypeDef I2C_init;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

GPIO_I2C_init.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_I2C_init.GPIO_Mode = GPIO_Mode_AF;
GPIO_I2C_init.GPIO_OType = GPIO_OType_OD;
GPIO_I2C_init.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_I2C_init.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_I2C_init);

GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);

I2C_init.I2C_ClockSpeed = 100000;
I2C_init.I2C_Mode = I2C_Mode_I2C;
I2C_init.I2C_Ack = I2C_Ack_Enable;
I2C_init.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_init.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_init.I2C_OwnAddress1 = 0x14;

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

}


int main(void)
{
Init_I2C_1();
SysTick_Config(SystemCoreClock/1000);

while(1)
{
I2C_GenerateSTART(I2C1, ENABLE);
while(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)==ERROR){}
I2C_Send7bitAddress(I2C1, 0xB8, I2C_Direction_Transmitter);
delay_ms(1);
I2C_GenerateSTOP(I2C1, ENABLE);
}

Re: STM32. Датчик AM2321

Добавлено: Чт янв 05, 2017 07:15:26
Ser60
Radist228 писал(а):Как сделать так чтобы у нас выставился NACK и линия SDA ушла в нуль.
А зачем? Эта линия контролируется датчиком. Задержка в 1 мс возможна из-за того, что датчик совершает "clock-stretching" по какой-то причине и драйвер I2C в MK ждёт пока датчик отпустит линию SCL. Вообще, то, что он не отзывается на свой адрес уже плохо. Уверены, что датчик рабочий и правильно подключен к МК?

В логическом анализаторе для правильного распознавания сигналов Старт/Стоп следует сконфигурировать "triggering" так, что на линии SDA фолжно стоять -f, а на линии SCL высокий уровень.

Re: STM32. Датчик AM2321

Добавлено: Чт янв 05, 2017 07:53:03
Albert_V
Radist228, Если верить данным с вашего логического анализатора, сразу после условия START - фронт по SDA налезает на спад SCL. Это может быть воспринято как условие STOP.
Изображение
СпойлерИзображение