完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
日常工作中,遇到过如题的问题,当时不知道原因,今天在代码仿真的时候,无意中发现了如题的不良现象,如下是keil 仿真的GPIO模拟I2C的结果
因为问题是在I2C起始条件之后,程序代码定位应该在start()和wrByte()函数之间, void CH450_Write(unsigned short cmd) //I2C写CH450 两个字节命令 { CH450_I2c_Start(); /*I2C start函数调用*/ CH450_I2c_WrByte((unsigned char)(CH450_GET_KEY>>7)&CH450_I2C_MASK|CH450_I2C_ADDR1); /*南京沁恒推荐CH450代码,与规格书存在一层转换*/ CH450_I2c_WrByte(cmd); /*写命令字第八位字节命令*/ CH450_I2c_Stop(); /*I2C stop函数调用*/ } 放大以后波形(测量时间间隔为33.5us,在24M 晶振对应12个机器指令周期,1个机器指令周期0.5us的条件下,对应67个机器指令周期) 打开调试命令按钮,查看汇编代码: 循环前(0x0982到0x0984):3个指令周期; 循环体(0x0985到098B):有8个指令周期;循环次数是7次,循环一共有56个指令周期; 其他(0x098C~0x0993):有8个指令周期 T total=3+56+8=67个指令周期,因此从start信号结束到第一个I2C_CLK 拉高,理论时间为33.5us,数据刚好符合 【改善对策】 根据CH450的规格书,我们可以对问题的代码,在芯片规格书的要求下进行优化,第一个字节数据直接用规格数上的0x48,0x4F,0x64,0x66,0x68,0x6A,0x6C,0x6E 来直接定位,而不是用复杂的语句来表示。 【实际效果】 对比之前的33.5us的时间间隔,调整以后的时间间隔缩短到8us以内,改善效果明显。 |
|
|
|
只有小组成员才能发言,加入小组>>
3311 浏览 9 评论
2994 浏览 16 评论
3493 浏览 1 评论
9058 浏览 16 评论
4087 浏览 18 评论
1176浏览 3评论
604浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
598浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2334浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1895浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 22:23 , Processed in 0.889152 second(s), Total 49, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号