打印

MCU间串口通信-缓存与高实时性高抗干扰状态机设计

[复制链接]
4108|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 Jay_Lynn 于 2013-1-12 22:29 编辑

小弟最近做个项目:
两个单片机要串口通信,一个是CC2530,一个是STM8S003
CC2530中有个很小的操作系统,简单的事件驱动机制,这是个带zigbee的单片机
STM8S003就是便宜到死的那种单片机比STC51强点

CC2530是主单片机
STM8S003是从单片机

硬件连接:1.串口RX,
               2.串口TX
               3. STM8S003忙状态输出,令一头连到CC2530,当STM8S003单片机在忙高于响应串口命令的事件时候,这个线输出为高,CC2530每次发送命令给STM8S003都要检测这根线
               4. CC2530正在发送数据状态输出,令一头连到STM8S003,CC2530想发命令就要至高这跟线,发完了立马拉低这跟线,STM8S003检测这跟线的,只有这跟线为高时才运行接收串口数据,这跟线为下降沿时,以这个为信号开始命令解析

当CC2530要发条命令问STMS003  现在LED2的状态是什么样的,  STMS003回答:LED是开的状态       CC2530收到数据后把这个数据通过无线发送到PC机
请问这个流程怎么设计比较合理??请大虾斧正?能最高提高系统实时性,能让系统在恶劣环境中生存,我想了几天,现在脑子里一团浆糊

设置这样的规则:CC2530发给STM8S003的命令有两种,一种要应答的一种不要应答的
   几个全局变量:要发送的命令数据负载buf,     应答回调函数指针   *pgobal_RX_data_CB(当为NULL时候表示不用应答)    要发送的命令gobal_CMD_send_now(当值为0xff时表示米有命令要发送)
任何一个CC2530中的任务要发数据给STMS003,要先填充发送buf,设置命令码,选择性设置 (应答回调函数指针   *pgobal_RX_data_CB)
CC2530发送时候调用系统的串口发送函数,函数是基于DMA机制的,对于APP层代码来说就是写内存,至于什么时候串口发送完成,APP层不关心
以下小弟想的方案,
设计概念
A.尽力保证系统实时性,因为CC2530内部任务多
B.数据传输过程中一定有可能出现误码,不相信串口传输可靠性
C.STMS003一定会在恶劣环境中死机,不相信STMS003能完全应答


我总觉得会降低系统实时性,(以下代码流程,状态机全部在CC2530中)













相关帖子

沙发
Jay_Lynn|  楼主 | 2013-1-11 23:31 | 只看该作者
最难搞定的是当CC2530要发送一个要求应答的命令时,状态机怎么设计比较合理

使用特权

评论回复
板凳
fp123123| | 2013-1-11 23:52 | 只看该作者
想明白了就用中断来接收数据,没什么复杂的,STM8的性能还不至于忙到无法响应串口,另外用一条BUSY信号线是多余的

使用特权

评论回复
地板
ayb_ice| | 2013-1-12 09:52 | 只看该作者
接收应答都用队列操作,
主任务不停的从队列接收数据包,处理数据包,应答数据包,这三个动作循环操作

使用特权

评论回复
5
Jay_Lynn|  楼主 | 2013-1-12 11:59 | 只看该作者
楼上兄弟的意思是,在两个单片机里面都建立RX,TX缓冲队列

比如我有3个线程A,B,C   通过串口给STM8发消息,他们都要求STM8应答,那么A应答未完成,但允许B,C发消息,,SMT8收到后,按收到消息的先后,一个个产生应答,放入队列,自动放送应答
CC2530这边又监测RX队列,按接收顺序映射到回调指针,直到接收队列的头指针==尾指针是吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

16

帖子

0

粉丝