Всем доброго времени суток.Совсем недавно я начал играться с контроллером STM32F407VG и вдоволь намигавшись со светодиодами было принято решение сделать что-то поинтереснее и для этих целей был куплен AM231.И в самом начале общения с ним начались проблемы. В технической документации на датчик сказано что для того чтобы завелся датчик надо подать по шине сигнал, как на картинке
Вложение:
nack.png [89.38 KiB]
Скачиваний: 407
При попытке повторения данного сигнала получается то, что показано на вот этой картинке
Вложение:
logic.png [10.01 KiB]
Скачиваний: 401
Тобишь, при отправке 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);
}