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

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

[复制链接]
三创电子(Tcreate) 提问时间:2014-2-13 21:55 /
阅读主题, 点击返回1楼
收藏 2 评论21 发布时间:2014-2-13 21:55
21个回答
三创电子(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.
从上述的资料显示应该不是说要发送停止位
 
 
回答时间:2014-2-15 17:34:02

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

这里的I2C_SoftEnd_Mode 是在地址数据发送以后产生一个restart信号,以表示用来读取E2的数据。而在写模式下,不用产生这个restart信号。
开始我理解的是发送一个NOACK,用来控制I2C总线停止工作做。通过手册,这里控制的是restart信号,可以参考下图中restart产生的信号位置。
1.jpg
三创电子(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的参考例程从那边下吗
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的数据。而在写模式下 ...

版主,可否指导下跨页写?谢谢
回答时间:2015-10-16 16:41:21
alisa123 发表于 2015-10-14 18:00
版主,可否指导下跨页写?谢谢

您好,用的哪款芯片。一般是硬件地址上面+2。
安臣 回答时间:2015-10-16 16:51:22
有机会来看看!
alisa123 回答时间:2015-10-19 14:39:59
安 发表于 2015-10-16 16:41
您好,用的哪款芯片。一般是硬件地址上面+2。

我用的就是stm32f030的,已经按照库里面的代码修改的可以跨页读写数据了,谢谢你了。
回答时间:2015-10-20 09:23:39
alisa123 发表于 2015-10-19 14:39
我用的就是stm32f030的,已经按照库里面的代码修改的可以跨页读写数据了,谢谢你了。 ...

不客气,要看I2C器件的硬件手册,上面有写。

所属标签

相似问题

官网相关资源

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