STM32. Датчик AM2321

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
Radist228
Родился
Сообщения: 15
Зарегистрирован: Ср ноя 25, 2015 18:05:40

STM32. Датчик AM2321

Сообщение Radist228 »

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

Тобишь, при отправке 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);
}
Реклама
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: STM32. Датчик AM2321

Сообщение Ser60 »

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

В логическом анализаторе для правильного распознавания сигналов Старт/Стоп следует сконфигурировать "triggering" так, что на линии SDA фолжно стоять -f, а на линии SCL высокий уровень.
Реклама
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: STM32. Датчик AM2321

Сообщение Albert_V »

Radist228, Если верить данным с вашего логического анализатора, сразу после условия START - фронт по SDA налезает на спад SCL. Это может быть воспринято как условие STOP.
Изображение
СпойлерИзображение
Ответить

Вернуться в «ARM»