三创电子(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产生的信号位置。

三创电子(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器件的硬件手册,上面有写。
页: 1 [2] 3
查看完整版本: STM32F030的I2C发送数据疑惑 求解答 谢谢