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

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;
埃斯提爱慕 回答时间:2015-7-12 21:41:28
提示: 作者被禁止或删除 内容自动屏蔽

所属标签

相似问题

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