求助各位大神:
åæ¢ä½é®é¢ 1.关于上拉的问题,如果在AT24CM01接口处使用上拉电阻(使用了3K,4.7K,5.1K,8K,10K),出现程序重启现象。使用debug调试,发现程序执行到SwI2cClrSda();或SwI2cClrScl();时,时钟线和数据线无法被拉低。然后直接跳转到main函数的第一句。在IO初始化的时候使用的OD模式,IO设置为PULLUP和NOPULL效果没有差别。 uint8_t IOI2C_Start(uint8_t devAddr) { // Start // Generate I2C START SwI2cSetScl(); SwI2cSetSda(); I2C_Delay; SwI2cClrSda(); I2C_Delay; SwI2cClrScl(); I2C_Delay; return IOI2C_TransmitByte(devAddr); } 2.将上拉电阻去掉。使用IO内部的上拉模式,程序读AT24CM01的时候没有问题,但是在写入数据的时候,正确的逻辑我的理解是需要在收到应答后,时钟线拉高,延时后数据线拉高,数据的上升沿在时钟线的高电平期间停止。但是按照上面思路写程序,程序会发生重启情况,使用debug调试,在执行SwI2cSetSda()这一句时,程序跳转到main函数的第一句。感觉是数据线无法拉高。我看到很多文章写,时钟线低电平期间,数据可以发生变化。时钟线为高时,数据不变。但是这样怎么能产生停止位。在程序中,(如图停止位问题)把1和2语句对调。即SwI2cSetScl();和SwI2cSetSda();对调。程序不会重启,但这时候时钟的高电平不会采集到数据的上升沿,停止位不对,数据也写不进去。按照我的理解写程序,程序会发生重启,但是用示波器看时钟线和数据线,逻辑是按照我的想法走的。如图(争取的写时序)。这个时候,用读函数,把写的位置上的数据读出来,数据都变成了FF。把SwI2cSetScl();和SwI2cSetSda();对调,程序不重启,但是数据也写不进去。 uint8_t IOI2C_WriteBlock(uint8_t devAddr, uint8_t *pMemAddr, uint8_t memAddrLen, const uint8_t *pData, uint16_t len) { ........ ...... SwI2cClrScl(); SwI2cClrSda(); I2C_Delay; SwI2cSetScl(); I2C_Delay; //SwI2cClrScl(); SwI2cSetSda(); //IOI2C_Stop(); } 总结一下:使用外部上拉时,程序会在发起始位的时候,从SCL或SDA拉低的语句跳转到main函数的第一句,整个程序不停的循环重启, 不使用外部上拉的时候,读函数没有问题,写函数会在停止位的最后,把SDA拉高的时候跳转到main函数的第一句,整个程序不停循环重启。 我是一个刚开始弄STM32单片机的菜鸟,需要各位帮助扫扫盲。谢谢了!!解决问题可以给点奖励。再次谢谢了。 |
硬件å¾
æ£ç¡®çåæ¢ä½ï¼ç¨åºä¸åéå¯
è¿ç§æ åµç¨åºä¸éå¯
读EEPROMçåæ¢ä½ï¼ç¨åºæ£å¸¸
IIC_wenti0612.zip
下载7.55 MB, 下载次数: 20, 下载积分: ST金币 -1
ç¨åºæºç
STM32L011D4芯片用SWD无法下载程序
求助:STM32L0系列标准库哪里下?
STM32L051低温时LPUART串口波特率异常
STM32L051单片机ADC如何彻底关闭?
STM32L051C8进入低功耗模式电流偏大
STM32L052C8T6通过I2C模拟读16位数
STM32L0的VLCD外接5V会有问题吗
STM32L072RB写Bank2 EEPROM不响应中断
STM32L031无法进入boot
用MDK5.12仿真STM32L011D3,怎么没法子看内部寄存器?
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分