OpenEdv-开源电子网

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

移植uCOS后AT24读正常,但写不进去数据

[复制链接]

2

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2020-9-2
在线时间
37 小时
发表于 2021-4-22 09:21:30 | 显示全部楼层 |阅读模式
10金钱
问题如下:在裸机程序中用原子哥的AT24C64读写程序测试正常,移植uCOS-iii后,AT24读正常,但写不进去数据,相关延时函数如delay_us()已启用宏SYSTEM_SUPPORT_OS,初始化时也添加了delay_init。请问下有人知道是什么原因造成的吗?:AT24写程序是在任务级的临界段中运行的。

最佳答案

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

用os的话,这里得阻止任务调度,不然delay没用,改用delay_us应该可以
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-4-22 09:21:31 | 显示全部楼层
jzxiao 发表于 2021-4-23 13:38
设置优先级最高尝试了也没用,这个和优先级没关系吧,是在临界段中调用的,都把调度器锁上了。
此外我尝试 ...

用os的话,这里得阻止任务调度,不然delay没用,改用delay_us应该可以
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

889

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1468
金钱
1468
注册时间
2020-8-19
在线时间
333 小时
发表于 2021-4-22 10:06:46 | 显示全部楼层
帮顶  
回复

使用道具 举报

13

主题

644

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1960
金钱
1960
注册时间
2021-4-16
在线时间
500 小时
发表于 2021-4-22 10:31:48 | 显示全部楼层
会不会是优先级太低了被其他的任务抢断了。
回复

使用道具 举报

2

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2020-9-2
在线时间
37 小时
 楼主| 发表于 2021-4-23 13:38:56 | 显示全部楼层
本帖最后由 jzxiao 于 2021-4-23 13:43 编辑

D:\毕设\图片\02设置优先级最高尝试了也没用,这个和优先级没关系吧,是在临界段中调用的,都把调度器锁上了。
此外我尝试把时间片轮转调度关掉也没用。测波形发现写单字节过后没有延时,不知是不是这个引起的。
写单字节函数如下
//在AT24CXX指定地址写入一个数据
//WriteAddr  :写入数据的目的地址   
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                                                                                                                                                                                          
    IIC_Start();         //开始信号
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);            //发送写命令
                IIC_Wait_Ack();
                IIC_Send_Byte(WriteAddr>>8);//发送高地址
        }else
        {
                IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据
        }         
        IIC_Wait_Ack();                          //等待应答信号
    IIC_Send_Byte(WriteAddr%256);   //发送低地址
        IIC_Wait_Ack();                                                                                                               
        IIC_Send_Byte(DataToWrite);     //发送字节                                                           
        IIC_Wait_Ack();                                 
    IIC_Stop();//产生一个停止条件
        delay_ms(5);         
}
这个delay_ms没有起到作用,波形是连续的,写一个字节后紧接着写第二个字节,
下图是调用AT24CXX_WriteLenByte(0x0002,1,2);测到的波形

02.jpg
回复

使用道具 举报

2

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2020-9-2
在线时间
37 小时
 楼主| 发表于 2021-4-24 22:05:22 | 显示全部楼层
正点原子 发表于 2021-4-22 09:21
用os的话,这里得阻止任务调度,不然delay没用,改用delay_us应该可以

感谢原子哥的回复!
我在临界段中调用的,阻止任务调度了已经。
改用delay_us我试了下也不行,我延时5000us,逻辑分析仪测出来写单个字节中间只间隔649us,请问是什么原因啊?
回复

使用道具 举报

2

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2020-9-2
在线时间
37 小时
 楼主| 发表于 2021-4-24 22:32:03 | 显示全部楼层
本帖最后由 jzxiao 于 2021-4-25 11:28 编辑

更新问题如下:
不使用os系统delay延时,iic能成功读写,延时5000us逻辑分析仪测得准确
使用os系统延时后,iic能读ee成功但写不成功,用逻辑分析仪测得每个SCL高低电平比不用os系统时长多了一倍作用,延时5000us仅647us,延时40000us约为5ms
下面是逻辑分析仪测到的波形对比,感觉就一处标红的地方不一样外,找不到其他问题。但使用OS就是写不进去数据,但读ee缺正常,原子哥能再帮忙看看吗?
波形对比.jpg
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 16:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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