OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2694|回复: 7

求助!!使用STM32L073 IO口模拟IIC接口读写AT24CM01 程序不停重启

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-6-11
在线时间
5 小时
发表于 2020-6-12 15:36:30 | 显示全部楼层 |阅读模式
2金钱
请问原子哥 和各位大神:
我用一块NUCLEO-L073RZ开发板IO口软件模拟IIC接口外接一个AT24CM01(1Mb内存)(如硬件图)。读写时出现问题如下:
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单片机的菜鸟,需要各位帮助扫扫盲。谢谢了!!解决问题可以给点奖励。再次谢谢了。

硬件图

硬件图
停止位问题.png

正确的写时序

正确的写时序
错误写时序.jpg
读时序.jpg

IIC_wenti0612.zip

7.55 MB, 下载次数: 64

程序代码

最佳答案

查看完整内容[请看2#楼]

谢谢提醒,问题解决了。不是软件的问题,硬件上5V和3.3V没有共地,信号不稳定造成的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-6-11
在线时间
5 小时
 楼主| 发表于 2020-6-12 15:36:31 | 显示全部楼层
三叶草 发表于 2020-6-13 15:49
在中断里打个断点看看是不是进去了

谢谢提醒,问题解决了。不是软件的问题,硬件上5V和3.3V没有共地,信号不稳定造成的。
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-6-11
在线时间
5 小时
 楼主| 发表于 2020-6-12 15:40:15 | 显示全部楼层
示波器上1线是1V,2线是100mv是由于探头不匹配造成的,可以忽略,1和2线一格都是1V。求各位大神帮忙看一看,跪谢了
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-6-11
在线时间
5 小时
 楼主| 发表于 2020-6-12 15:48:19 | 显示全部楼层
附件是AT24CM01的手册

AT24CM01-SHM-T-datasheet-pdf-www.findic.com.pdf

854.24 KB, 下载次数: 8

回复

使用道具 举报

4

主题

203

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2936
金钱
2936
注册时间
2019-8-16
在线时间
317 小时
发表于 2020-6-12 17:51:44 | 显示全部楼层
帮顶!
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-6-13 10:04:37 | 显示全部楼层
是不是有看门狗,禁止看门狗试试,还有检测一下是不是进入硬件错误中断了,数组有没有溢出
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-6-11
在线时间
5 小时
 楼主| 发表于 2020-6-13 11:07:06 | 显示全部楼层
三叶草 发表于 2020-6-13 10:04
是不是有看门狗,禁止看门狗试试,还有检测一下是不是进入硬件错误中断了,数组有没有溢出

没有开启看门狗,硬件错误中断怎么检测啊。
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-6-13 15:49:28 | 显示全部楼层
valuntin 发表于 2020-6-13 11:07
没有开启看门狗,硬件错误中断怎么检测啊。

在中断里打个断点看看是不是进去了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 05:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表