8706|22

56

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Wince下2个普通GPIO(模拟TX,RX)+1个定时器模拟串口通信的驱动问题,搞不定就的走人了,大家帮帮忙啊! [复制链接]

大家好!我们用的是君正jz4740的CPU,由于JZ4740只有两个串口(已有用途),现在不够,用需要第三个串口,

于是乎想用GPIO来模拟一个串口来通信,我的gpio模拟串口是用在终端通讯上的,要通过串口发送和接收少量的

数据(比如我要拨打电话,就通过串口发送封装过好AT命令到有GPRS模块的终端上,或者接受来自GPRS终端上的

数据),9600的波特率就可以。硬件上已经设计好了,GPIO_20,GPIO_21分别为TX,Rx。现在有个思路是:

        当gpio模拟串口的驱动被加载时,定时器开始计时,定时的时间为35us(3倍的波特率9600),一旦定时

器计时到期则产生定时中断,进入中断处理函数,中断处理函数的功能是:检测有没有数据要接收或者有没有要发

送。

数据发送的思想是:当启动字节发送时,通过TxD先发起始位,然后发数据位,最后再发停止位,发送过程由发送

状态机控制,每3次中断只发送1个位,经过若干个定时中断完成1个字节帧的发送。

数据接收的思想是:当不在字节帧接收过程时,每次定时中断以3倍的波特率监视RxD的状态,当其连续3次采样电

平依次为1、0、0时,就认为检测到了起始位,则开始启动一次字节帧接收,然后将该定时进行3分频再调用数据

接收函数,进行准确波特率下的串口通信,字节帧接收过程由接收状态机控制,每3次中断只接收1个位,经过若

干个定时中断完成1个字节帧的接收。

用定时中断来控制串口数据的收发,但是定时中断要求的时间为35us,如果我按wince下的方法编写驱动的话,它

是跑在操作系统之上的,通过device.exe来加载我的驱动,并且要开线程,可是操作系统104us的定时达不到呀!

而且我如果开线程的话,可能导致中断不准确,那么接收和发送的数据就不对,所以只能用更底层的方法来实现

,在wince下我该如何实现将定时器物理中断号和中断处理函数挂钩呢?即定时中断产生时,就调用中断处理函数

。我要实现35us的定时,肯定用不了wince操作系统的那一套Createvent(),Creatthread().而且不能创建线程,

我的35us定时是通过硬定时来实现的。

不知道上述的方法是否可行?如果不可行,希望能给个方案参考下,非常感谢!搞不定就的走人拉,大家帮帮忙

呀!高分求救!
此帖出自WindowsCE论坛

最新回复

dimhp:    我也是想用GPIO来仿真一个串口UART,主要是用来接GPS的NEMA语句,现在已经可以收到NEMA语句了,但错误较多。我主要用的都是硬TImer。这些错误正在排查,搞不清是不是程序错误造成的。有空向你请教~我QQ:171630186 手机13965752204   详情 回复 发表于 2010-3-30 19:51
点赞 关注
 

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
帮顶一下!
以前在270下面想做这个,没有成功。貌似用gpio模拟串口行不通,主要是时序不好控制。希望lz加油。
此帖出自WindowsCE论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
虽然没这样做过,但看上去可能会有问题的,
没有硬件接收BUFFER,可能会丢数据
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
楼主,使用GPIO模拟串口是行不通的。即使成功也是很多误码。
使用一个并口扩展串口芯片即可,比较简单的。我们就是这样做的。
此帖出自WindowsCE论坛
 
 
 

回复

103

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢楼上的两位的回复!
对Ricky_hu:我看过单片机中普通GPIO模拟串口的程序,实现的还比较简单的,但是在Wince机制下不知道该怎么用?
对LinHanLao:我在发送和接收的程序中都加有FIFO的,大小可以改变。
此帖出自WindowsCE论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

6
 
to:gooogleman 非常感谢!
   我们的CPU好像是没有并口。而且我们现在CPU的所有引脚都已经用完了,只剩下两个GPIO。我该怎么办?我再找找,利用GPIO好像可以把SPI口换出来,不过还缺两根。gooogleman:请问你们用的是什么芯片?有没有I2C转串口的,或者SPI转串口的芯片。
不过这一版的PCB中已经定了,只能用模拟去实现了,要是实在实现不了,那只能加转换芯片,而且只能等下一版了。
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
我认识的同事和朋友中,没有谁在wince下面用gpio来模拟串口成功的。我们使用的cpu是pxa270和omap750,omap850系列,都没有成功。所以lz还是要慎重考虑。也没有必要立军令状,说搞不定就走人的话。加油!
此帖出自WindowsCE论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

8
 
SPI有,前几天有个人还在这里求助。你搜索一下吧。不过难度也不小。
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
to: Ricky_hu,谢谢你的提醒,那我这次真的完蛋了,这次的原理图全部我自己画的,而且是第二版了,本来第一版中本来串口够用,但第二版老板叫我又增加一个使用串口的模块,所以不够,最初的时候有过增加一个一转二或三的芯片,但我觉得太麻烦,又增加成本,所以决定采用GPIO模拟串口的方案,哪知......
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

10
 
先做个标记
不懂
此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

11
 
你的需求是所有串口始终都在用么,如果实在没办法,可以在一个实串口的基础上,做多个虚串口这些虚串口共用这个实串口,通过模块状态对虚串口切换将串口资源分配给优先级高的模块。
此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 10 楼 ljkever_2008 的回复:
你的需求是所有串口始终都在用么,如果实在没办法,可以在一个实串口的基础上,做多个虚串口这些虚串口共用这个实串口,通过模块状态对虚串口切换将串口资源分配给优先级高的模块。


这个方法好,有机会试试。
此帖出自WindowsCE论坛
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

13
 
IO 模拟串口可以用了发发控制命令,要是做数据通信 估计没戏
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

14
 
to ljkever_2008:你这个想法很不错,想具体了解一下。能不能讲解的再详细点?

不过我的三个串口都有可能同时用的。
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

15
 
楼主,用GPIO口模拟的话就不用去想了,大牛才能完成这个东东
你的目的很简单,无非要扩展串口而已,那你硬件上加个串口扩展芯片不就得了,或用总线扩展,或帮IIC扩展,驱动都比较好写
你用GPIO口去模拟的话,而且还做为GPRS发AT命令,通信,基本是死路一条吧
此帖出自WindowsCE论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

16
 
有这样的老板的吗?走人也没有什么好可惜的
不过一般GPIO模拟也只是用来简单的通信用的,如果是大量数据传输的话可靠性肯定会有问题的,毕竟是多任务实时的操作系统,时序什么的存在不确定性
此帖出自WindowsCE论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

17
 
有很大难度!
搞不定就得走人,这种公司不呆也罢!
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

18
 
单片机使用IO模拟串口很容易实现,而操作系统下很难实现。

主要原因就在于:单片机的定时器中断响应很快,不会被别的任务占先、抢夺、打断,能确保串口时序的稳定、准确。
而操作系统中,任务的等级差不多,都由调度线程来按时间片唤起。而定时器在操作系统中属于比较弱的任务等级,很容易就导致时序的偏差。

可能可以实现的方法是:在驱动中做该IO模拟时序,而不是在系统中,分别创建读线程和写线程,用WaitForSingleObject(event, WaitTimerOut)来实现较精确的定时,WaitTimerOut需要设的很小,以确保即使被系统其他任务抢先几次,也不会造成时序的偏差。
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

19
 
非常感谢楼上各位的建议! 看来用软件来实现确实是有点困难,打算放弃了,只好等下一版改版再增加一个串口扩展芯片或其他的来实现了

引用 17 楼 shuiyan 的回复:

可能可以实现的方法是:在驱动中做该IO模拟时序,而不是在系统中,分别创建读线程和写线程,用WaitForSingleObject(event, WaitTimerOut)来实现较精确的定时,WaitTimerOut需要设的很小,以确保即使被系统其他任务抢先几次,也不会造成时序的偏差。


to shuiyan: 对wince中的驱动我了解的不是很多,请原谅我的无知,有个问题问一下: 如果在驱动中实现,而不在系统中实现的话,有WaitForSingleObject函数可以用吗?这个不是wince的东西吗?还有创建线程的话不是又涉及到wince内核管理那一块了吗?那能达到微妙级的时间吗?


此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

20
 

之前我在linux下实现过一个红外解码驱动,用的是278us的定时中断,基本思路跟这个有点像即:定时器1每隔

278us产生一个中断,中断产生跳转到中断处理函数,中断处理函数中实现红外解码,如果解码值正确则产生一个

异步信号通知用户读取。由于linux操作系统的最小时间片为1ms,故没有用到Linux下的jiffes.也没有开线程,

就用了一个request_irq()函数将定时器1的物理中断和中断处理函数关联,278us用硬定时实现的,我用示波器测

了,非常准确。驱动程序加载后,在应用程序端打开我的设备文件,并将应用程序设置成精灵进程即可。这样用

户什么时候按下什么键都可以准确地解码出来。

其实以上GPIO模拟UART的思路也是来自于此。
此帖出自WindowsCE论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表