| Форум РадиоКот https://radiokot.ru/forum/ |
|
| STM32. Датчик AM2321 https://radiokot.ru/forum/viewtopic.php?f=59&t=140098 |
Страница 1 из 1 |
| Автор: | Radist228 [ Чт дек 29, 2016 17:12:40 ] |
| Заголовок сообщения: | STM32. Датчик AM2321 |
Всем доброго времени суток.Совсем недавно я начал играться с контроллером STM32F407VG и вдоволь намигавшись со светодиодами было принято решение сделать что-то поинтереснее и для этих целей был куплен AM231.И в самом начале общения с ним начались проблемы. В технической документации на датчик сказано что для того чтобы завелся датчик надо подать по шине сигнал, как на картинке Вложение: При попытке повторения данного сигнала получается то, что показано на вот этой картинке Вложение: Тобишь, при отправке 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 [ Чт янв 05, 2017 07:15:26 ] |
| Заголовок сообщения: | Re: STM32. Датчик AM2321 |
Radist228 писал(а): Как сделать так чтобы у нас выставился NACK и линия SDA ушла в нуль. А зачем? Эта линия контролируется датчиком. Задержка в 1 мс возможна из-за того, что датчик совершает "clock-stretching" по какой-то причине и драйвер I2C в MK ждёт пока датчик отпустит линию SCL. Вообще, то, что он не отзывается на свой адрес уже плохо. Уверены, что датчик рабочий и правильно подключен к МК? В логическом анализаторе для правильного распознавания сигналов Старт/Стоп следует сконфигурировать "triggering" так, что на линии SDA фолжно стоять -f, а на линии SCL высокий уровень. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


