Всем доброго времени суток.Совсем недавно я начал играться с контроллером 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);
}
При попытке повторения данного сигнала получается то, что показано на вот этой картинке
Тобишь, при отправке 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);
}
