'守護^ 发表于 2015-7-11 23:42:39

I2C驱动配置,读AD时单片机发送应答信号语句应该怎样写?

      现在在用STM32F407配置ADS1100的驱动程序,ADS1100用的是I2C总线,在芯片的数据 手册上面看了读写的时序。时序图在附件。      读AD时,单片机发送应答信号的语句应该怎么写的?在时序图中是一个低电平信号,是不是就是说,接收完一个字节数据之后产生一个低电平信号来作为应答。      附上我的配置代码。

void I2C_Configure(void)
{
I2C_InitTypeDefI2C_InitStructure;

GPIO_InitTypeDefGPIO_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);
//PB8SCL   PB9SDA
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;
}




'守護^ 发表于 2015-7-12 00:05:27

是不是只需要控制I2C_CR1(I2C控制寄存器1)的ACK位就好了?
具体语句是不是可以这样写:
I2C1->ACK = 1;//发送应答信号

'守護^ 发表于 2015-7-12 00:08:06

不对,应该是:
I2C1->CR1= 1<<10;

dsjsjf 发表于 2015-7-12 21:41:28

没用过硬件IIC,帮顶
页: [1]
查看完整版本: I2C驱动配置,读AD时单片机发送应答信号语句应该怎样写?