完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在调试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 |
|
相关推荐
21个回答
|
|
回复第 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模式。
最佳答案
|
|
|
|
自己先顶一个 期待高人指教呀
|
|
|
|
这个过程就是要看I2C协议了。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 |
|
|
|
我说的意思就是换成蓝色的,就是停止了。对于I2C操作不理解,建议看一下I2C协议,里面详细描述了I2C如何读写。
|
|
|
|
我就是不理解蓝色的配置怎么会导致停止呢
|
|
|
|
回复第 5 楼 于2014-02-14 11:01:01发表:
我说的意思就是换成蓝色的,就是停止了。对于I2C操作不理解,建议看一下I2C协议,里面详细描述了I2C如何读写。 我就是不怎么理解蓝色的配置怎么会导致I2C停止了 |
|
|
|
I2C_SoftEnd_Mode,这个就是进入结束模式。如果需要从设备继续工作,就要重新连接,你I2C基础不好。建议还是看看协议吧。
|
|
|
|
回复第 8 楼 于2014-02-14 14:50:48发表:
I2C_SoftEnd_Mode,这个就是进入结束模式。如果需要从设备继续工作,就要重新连接,你I2C基础不好。建议还是看看协议吧。 那读数据的配置也是I2C_SoftEnd_Mode呀,而且个人理解I2C_SoftEnd_Mode配置的意思是 有软件具体操作来发送停止位吧(又自动发送停止位) |
|
|
|
I2C_SoftEnd_Mode,说明要发送停止位了。这个只是一个定义,为了方便大家理解这个标志位用来做什么。
|
|
|
|
回复第 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. 从上述的资料显示应该不是说要发送停止位 |
|
|
|
这里的I2C_SoftEnd_Mode 是在地址数据发送以后产生一个restart信号,以表示用来读取E2的数据。而在写模式下,不用产生这个restart信号。
开始我理解的是发送一个NOACK,用来控制I2C总线停止工作做。通过手册,这里控制的是restart信号,可以参考下图中restart产生的信号位置。 |
|
|
|
能告诉我st的参考例程从那边下吗
|
|
|
|
TOPCB 发表于 2018-10-29 20:48 楼主,你好,可否指导下跨页写?谢谢! |
|
|
|
TOPCB 发表于 2018-10-29 20:48 版主,可否指导下跨页写?谢谢 |
|
|
|
|
|
|
|
有机会来看看!
|
|
|
|
我用的就是stm32f030的,已经按照库里面的代码修改的可以跨页读写数据了,谢谢你了。 |
|
|
|
不客气,要看I2C器件的硬件手册,上面有写。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1049 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1017 浏览 2 评论
2123 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1219 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1639 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 15:18 , Processed in 0.886272 second(s), Total 111, Slave 94 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号