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

STM32F030的I2C发送数据疑惑 求解答 谢谢

[复制链接]
三创电子(Tcreate) 提问时间:2014-2-13 21:55 /
最近在调试STM32F030单片机的I2C总线,现在虽然参考官方实例调试成功了 但是有一些地方还不是很明白,暂时也未看懂,希望知道的大神可以赐教 小弟先谢过了!

void I2C_uWriteData(INT8U SlaveAddr,INT16U WriteAddr,INT8U WriteLen,INT8U *WriteBuf)
{
 INT8U i;

 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
 I2C_TransferHandling(I2C1,SlaveAddr,2,I2C_Reload_Mode,I2C_Generate_Start_Write);   // I2C_SoftEnd_Mode
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
 I2C_SendData(I2C1,WriteAddr >> 8);
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
 I2C_SendData(I2C1,WriteAddr % 256);
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TCR) == RESET);
 I2C_TransferHandling(I2C1,SlaveAddr,WriteLen,I2C_AutoEnd_Mode,I2C_No_StartStop);   // I2C_Generate_Start_Write
 for(i=0;i
收藏 2 评论21 发布时间:2014-2-13 21:55

举报

21个回答
废鱼 回答时间:2014-2-15 17:34:02

回复:STM32F030的I2C发送数据疑惑 求解答 谢谢

这里的I2C_SoftEnd_Mode 是在地址数据发送以后产生一个restart信号,以表示用来读取E2的数据。而在写模式下,不用产生这个restart信号。
开始我理解的是发送一个NOACK,用来控制I2C总线停止工作做。通过手册,这里控制的是restart信号,可以参考下图中restart产生的信号位置。
1.jpg
alisa123 回答时间:2015-10-14 18:00:04
安 发表于 2014-2-15 17:34
这里的I2C_SoftEnd_Mode 是在地址数据发送以后产生一个restart信号,以表示用来读取E2的数据。而在写模式下 ...

楼主,你好,可否指导下跨页写?谢谢!
alisa123 回答时间:2015-10-14 18:00:42
安 发表于 2014-2-15 17:34
这里的I2C_SoftEnd_Mode 是在地址数据发送以后产生一个restart信号,以表示用来读取E2的数据。而在写模式下 ...

版主,可否指导下跨页写?谢谢
三创电子(Tcreate) 回答时间:2014-2-13 22:04:18

RE:STM32F030的I2C发送数据疑惑 求解答 谢谢

自己先顶一个 期待高人指教呀
废鱼 回答时间:2014-2-14 09:55:27

RE:STM32F030的I2C发送数据疑惑 求解答 谢谢

这个过程就是要看I2C协议了。I2C协议规定,首先要先通过设备地址访问设备,然后告诉设备是读还是写状态,然后再进行读写,读写完毕后发送一个结束命令。如果你上述红色字体修改,第一个命令就是结束了。
三创电子(Tcreate) 回答时间:2014-2-14 10:24:50

回复:STM32F030的I2C发送数据疑惑 求解答 谢谢

回复第 3 楼 于2014-02-14 09:55:27发表:
这个过程就是要看I2C协议了。I2C协议规定,首先要先通过设备地址访问设备,然后告诉设备是读还是写状态,然后再进行读写,读写完毕后发送一个结束命令。如果你上述红色字体修改,第一个命令就是结束了。 

红色标注的是可以实现操作的,蓝色标注的无法成功
这是可以实现读数据的代码 相比之下,写操作的配置我就看不明白了

void I2C_uReadData(INT8U SlaveAddr,INT16U ReadAddr,INT8U ReadLen,INT8U *ReadBuf)
{
 INT8U i;
 
 // 等待总线空闲
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
 I2C_TransferHandling(I2C1,SlaveAddr,2,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
 I2C_SendData(I2C1,ReadAddr >> 8);
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
 I2C_SendData(I2C1,ReadAddr % 256);
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC) == RESET);
 I2C_TransferHandling(I2C1,SlaveAddr,ReadLen,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);
 for(i=0;i
废鱼 回答时间:2014-2-14 11:01:01

RE:STM32F030的I2C发送数据疑惑 求解答 谢谢

我说的意思就是换成蓝色的,就是停止了。对于I2C操作不理解,建议看一下I2C协议,里面详细描述了I2C如何读写。
三创电子(Tcreate) 回答时间:2014-2-14 14:21:39

回复:STM32F030的I2C发送数据疑惑 求解答 谢谢

我就是不理解蓝色的配置怎么会导致停止呢
三创电子(Tcreate) 回答时间:2014-2-14 14:22:37

回复:STM32F030的I2C发送数据疑惑 求解答 谢谢

回复第 5 楼 于2014-02-14 11:01:01发表:
我说的意思就是换成蓝色的,就是停止了。对于I2C操作不理解,建议看一下I2C协议,里面详细描述了I2C如何读写。 

我就是不怎么理解蓝色的配置怎么会导致I2C停止了
废鱼 回答时间:2014-2-14 14:50:48

RE:STM32F030的I2C发送数据疑惑 求解答 谢谢

I2C_SoftEnd_Mode,这个就是进入结束模式。如果需要从设备继续工作,就要重新连接,你I2C基础不好。建议还是看看协议吧。
三创电子(Tcreate) 回答时间:2014-2-14 16:10:41

回复:STM32F030的I2C发送数据疑惑 求解答 谢谢

回复第 8 楼 于2014-02-14 14:50:48发表:
I2C_SoftEnd_Mode,这个就是进入结束模式。如果需要从设备继续工作,就要重新连接,你I2C基础不好。建议还是看看协议吧。 

那读数据的配置也是I2C_SoftEnd_Mode呀,而且个人理解I2C_SoftEnd_Mode配置的意思是 有软件具体操作来发送停止位吧(又自动发送停止位)
废鱼 回答时间:2014-2-15 08:54:04

RE:STM32F030的I2C发送数据疑惑 求解答 谢谢

I2C_SoftEnd_Mode,说明要发送停止位了。这个只是一个定义,为了方便大家理解这个标志位用来做什么。
三创电子(Tcreate) 回答时间:2014-2-15 12:39:32

回复:STM32F030的I2C发送数据疑惑 求解答 谢谢

回复第 10 楼 于2014-02-15 08:54:04发表:
I2C_SoftEnd_Mode,说明要发送停止位了。这个只是一个定义,为了方便大家理解这个标志位用来做什么。 

这是固件库对此函数的注解和代码
/**
  * @brief  Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set).
  * @param  I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  * @param  Address: specifies the slave address to be programmed.
  * @param  Number_Bytes: specifies the number of bytes to be programmed.
  *          This parameter must be a value between 0 and 255.
  * @param  ReloadEndMode: new state of the I2C START condition generation.
  *          This parameter can be one of the following values:
  *            @arg I2C_Reload_Mode: Enable Reload mode .
  *            @arg I2C_AutoEnd_Mode: Enable Automatic end mode.
  *            @arg I2C_SoftEnd_Mode: Enable Software end mode.
  * @param  StartStopMode: new state of the I2C START condition generation.
  *          This parameter can be one of the following values:
  *            @arg I2C_No_StartStop: Don't Generate stop and start condition.
  *            @arg I2C_Generate_Stop: Generate stop condition (Number_Bytes should be set to 0).
  *            @arg I2C_Generate_Start_Read: Generate Restart for read request.
  *            @arg I2C_Generate_Start_Write: Generate Restart for write request.
  * @retval None
  */
void I2C_TransferHandling(I2C_TypeDef* I2Cx, uint16_t Address, uint8_t Number_Bytes, uint32_t ReloadEndMode, uint32_t StartStopMode)
{
  uint32_t tmpreg = 0;
 
  /* Check the parameters */
  assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  assert_param(IS_I2C_SLAVE_ADDRESS(Address)); 
  assert_param(IS_RELOAD_END_MODE(ReloadEndMode));
  assert_param(IS_START_STOP_MODE(StartStopMode));
   
  /* Get the CR2 register value */
  tmpreg = I2Cx->CR2;
 
  /* clear tmpreg specific bits */
  tmpreg &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP));
 
  /* update tmpreg */
  tmpreg |= (uint32_t)(((uint32_t)Address & I2C_CR2_SADD) | (((uint32_t)Number_Bytes CR2 = tmpreg; 
}
参数的宏定义
#define  I2C_CR2_RELOAD                    ((uint32_t)0x01000000)        /*!< NBYTES reload mode */
#define  I2C_CR2_AUTOEND                 ((uint32_t)0x02000000)        /*!< Automatic end mode (master mode) *
#define  I2C_Reload_Mode                I2C_CR2_RELOAD
#define  I2C_AutoEnd_Mode               I2C_CR2_AUTOEND
#define  I2C_SoftEnd_Mode               ((uint32_t)0x00000000)
我参考的是F05x的编程手册(不知道我参考的编程手册是否适合F03x)
Bit 25 AUTOEND :  Automatic end mode (master mode)
This bit is set and cleared by software.
0: software end mode: TC flag is set when NBYTES data are transferred, stretching SCL low.
1: Automatic end mode: a STOP condition is automatically sent when NBYTES data are
transferred.
Note: This bit has no effect in slave mode or when the RELOAD bit is set.
Bit 24 RELOAD:   NBYTES  reload mode
This bit is set and cleared by software.
0: The transfer is completed after the NBYTES data transfer (STOP or RESTART will follow).
1: The transfer is not completed after the NBYTES data transfer (NBYTES will be reloaded).
TCR flag is set when NBYTES data are transferred, stretching SCL low.
从上述的资料显示应该不是说要发送停止位
 
 
三创电子(Tcreate) 回答时间:2014-2-16 11:13:47

回复:STM32F030的I2C发送数据疑惑 求解答 谢谢

回复第 12 楼 于2014-02-15 17:34:02发表:
这里的I2C_SoftEnd_Mode 是在地址数据发送以后产生一个restart信号,以表示用来读取E2的数据。而在写模式下,不用产生这个restart信号。
开始我理解的是发送一个NOACK,用来控制I2C总线停止工作做。通过手册,这里控制的是restart信号,可以参考下图中restart产生的信号位置。

 

对的 在地址之后 写不需要START信号。但是我觉得不产生START信号应该是有这句的I2C_No_StartStop设置的;这样下面的配置就可以理解了,I2C_TransferHandling(I2C1,SlaveAddr,WriteLen,I2C_AutoEnd_Mode,I2C_No_StartStop);
开始那个还是有些不明白,看资料一般是超过255字节 才用I2C_Reload_Mode模式。
songwei2030 回答时间:2015-7-21 18:09:42
能告诉我st的参考例程从那边下吗
12下一页

所属标签

相似问题

官网相关资源

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