现在在用STM32F407配置ADS1100的驱动程序,ADS1100用的是I2C总线,在芯片的数据 手册上面看了读写的时序。时序图在附件。 读AD时,单片机发送应答信号的语句应该怎么写的?在时序图中是一个低电平信号,是不是就是说,接收完一个字节数据之后产生一个低电平信号来作为应答。 附上我的配置代码。
- void I2C_Configure(void)
- {
- I2C_InitTypeDef I2C_InitStructure;
-
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
-
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_I2C1);
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_I2C1);
- //PB8 SCL PB9 SDA
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- I2C_DeInit(I2C1);
- I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
- I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
- I2C_InitStructure.I2C_OwnAddress1 = 0x90; //ADS1100地址
- I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //ack enable
- I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
- I2C_InitStructure.I2C_ClockSpeed = 100000; //100kHz
-
- I2C_Cmd(I2C1, ENABLE);
- I2C_Init(I2C1, &I2C_InitStructure);
- }
复制代码- void Write_AD(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint8_t value)
- {
- I2C_GenerateSTART(I2Cx,ENABLE);
- //产生起始条件
- while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
- //等待ACK
- I2C_Send7bitAddress(I2Cx,I2C_Addr,I2C_Direction_Transmitter);
- //向设备发送设备地址
- while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
- //等待ACK
- I2C_SendData(I2Cx, value);
- //发送数据
- while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
- //发送完成
- I2C_GenerateSTOP(I2Cx, ENABLE);
- //产生结束信号
- }
复制代码- u16 Read_AD(I2C_TypeDef *I2Cx,uint8_t I2C_Addr)
- {
- u8 ADCdatah,ADCdatal;
- u16 ADCdata;
- //等待I2C总线空闲
- while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
- //发送起始条件
- I2C_GenerateSTART(I2Cx, ENABLE);
- //等待ACK
- while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
- //向设备发送设备地址
- I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);
- //等待ACK
- while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
- while(!(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)));
-
- ADCdatah = I2C_ReceiveData(I2Cx);
-
- //从时序图中看到,读取一个字节数据之后,单片机需要产生一个应答信号,这里应答信号应该怎么写的?求各位棒棒忙,感激不尽!
-
- while(!(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)));
-
- ADCdatal = I2C_ReceiveData(I2Cx);
-
- I2C_AcknowledgeConfig(I2Cx, DISABLE);
-
- I2C_GenerateSTOP(I2Cx, ENABLE);
-
- ADCdata = ADCdatah * 256 + ADCdatal;
-
- return ADCdata;
- }
复制代码
|
具体语句是不是可以这样写:
I2C1->ACK = 1; //发送应答信号
I2C1->CR1= 1<<10;