你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
'守護^ 提问时间:2015-7-11 23:42 /
        现在在用STM32F407配置ADS1100的驱动程序,ADS1100用的是I2C总线,在芯片的数据 手册上面看了读写的时序。时序图在附件。        读AD时,单片机发送应答信号的语句应该怎么写的?在时序图中是一个低电平信号,是不是就是说,接收完一个字节数据之后产生一个低电平信号来作为应答。        附上我的配置代码。

  1. void I2C_Configure(void)
  2. {
  3.   I2C_InitTypeDef  I2C_InitStructure;
  4.   
  5.   GPIO_InitTypeDef  GPIO_InitStructure;
  6.   
  7.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
  8.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
  9.   
  10.   GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_I2C1);
  11.   GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_I2C1);
  12.   //PB8  SCL   PB9  SDA
  13.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9;
  14.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  15.   GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  16.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  18.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  19.   
  20.   I2C_DeInit(I2C1);
  21.   I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  22.   I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  23.   I2C_InitStructure.I2C_OwnAddress1 = 0x90;  //ADS1100地址
  24.   I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;  //ack enable
  25.   I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  26.   I2C_InitStructure.I2C_ClockSpeed = 100000;  //100kHz
  27.   
  28.   I2C_Cmd(I2C1, ENABLE);
  29.   I2C_Init(I2C1, &I2C_InitStructure);
  30. }
复制代码
  1. void Write_AD(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint8_t value)
  2. {
  3.   I2C_GenerateSTART(I2Cx,ENABLE);
  4.   //产生起始条件
  5.   while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
  6.   //等待ACK
  7.   I2C_Send7bitAddress(I2Cx,I2C_Addr,I2C_Direction_Transmitter);
  8.   //向设备发送设备地址
  9.   while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  10.   //等待ACK
  11.   I2C_SendData(I2Cx, value);
  12.   //发送数据
  13.   while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  14.   //发送完成
  15.   I2C_GenerateSTOP(I2Cx, ENABLE);
  16.   //产生结束信号
  17. }
复制代码
  1. u16 Read_AD(I2C_TypeDef *I2Cx,uint8_t I2C_Addr)
  2. {
  3.   u8 ADCdatah,ADCdatal;
  4.   u16 ADCdata;
  5.   //等待I2C总线空闲
  6.   while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
  7.   //发送起始条件
  8.   I2C_GenerateSTART(I2Cx, ENABLE);
  9.   //等待ACK
  10.   while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
  11.   //向设备发送设备地址
  12.   I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);
  13.   //等待ACK
  14.   while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  15.   while(!(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)));
  16.   
  17.   ADCdatah = I2C_ReceiveData(I2Cx);
  18.   
  19. //从时序图中看到,读取一个字节数据之后,单片机需要产生一个应答信号,这里应答信号应该怎么写的?求各位棒棒忙,感激不尽!  
  20.   
  21.   while(!(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)));
  22.   
  23.   ADCdatal = I2C_ReceiveData(I2Cx);
  24.   
  25.   I2C_AcknowledgeConfig(I2Cx, DISABLE);
  26.   
  27.   I2C_GenerateSTOP(I2Cx, ENABLE);
  28.   
  29.   ADCdata = ADCdatah * 256 + ADCdatal;
  30.   
  31.   return ADCdata;
  32. }
复制代码





1.jpg
2.jpg
收藏 评论3 发布时间:2015-7-11 23:42

举报

3个回答
'守護^ 回答时间: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,帮顶

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版