完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
操作,可以通过启用IIC超时功能来实现这个目的。以下是使用NUC029的IIC超时功能的步骤:
1. 确定IIC总线的时钟频率和超时时间,超时时间应该设置成一个能够允许从设备响应的时间加上一定的安全时间。 2. 启用IIC超时功能,可以通过设置I2CON的TOCNT字段来实现。TOCNT的取值范围是0~255,表示超时时间是多少个IIC总线时钟周期。 3. 在IIC操作前,启动超时计时器,并在每次IIC传输完成后重置计时器。 4. 在IIC传输过程中,检测超时计时器的计数值是否达到了预设的超时时间,如果是,则退出IIC操作,并进行错误处理。 以下是代码示例(仅供参考): ```C #define I2C_TIMEOUT 100 // 超时时间,单位为ms #define I2C_FREQ 400000 // IIC总线的时钟频率 void i2c_start_timeout(void) { // 设置计时器的时钟周期为IIC总线时钟周期 TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, I2C_FREQ); TIMER_Start(TIMER0); // 设置IIC超时时间 I2C_SET_TIMEOUT(I2C0, (I2C_TIMEOUT * I2C_FREQ) / 1000); } void i2c_reset_timeout(void) { // 重置计时器 TIMER_Stop(TIMER0); TIMER_ClearIntFlag(TIMER0); TIMER_Start(TIMER0); } void i2c_wait_timeout(void) { // 检测计时器是否已经超时 if(TIMER_GetIntFlag(TIMER0)) { // 计时器超时,退出IIC传输 I2C_STOP(I2C0); // 进行错误处理 ... } } void i2c_transfer(..., slave_addr, ..., is_read) { ... i2c_start_timeout(); // 启动超时计时器 while(i2c_is_busy()) { // 检测计时器是否超时 i2c_wait_timeout(); } i2c_reset_timeout(); // 重置超时计时器 I2C_SET_DATA(I2C0, (slave_addr << 1) | is_read); // 发送地址和读写位 I2C_SET_CONTROL_REG(I2C0, I2C_CTL_SI); // 触发START并发送地址 ... } ``` |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1175浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 16:13 , Processed in 1.192603 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号