ARM-Linux(mini2440)串口与51单片机的9位串口通讯

ARM-Linux(mini2440)串口与51单片机的9位串口通讯

  (2013-03-10 16:09:34)
标签: 

9bit串口

 

arm-linux

 

51单片机

分类: 技术之路
ARM-Linux(mini2440)串口与51单片机的9位串口通讯:

当51单片机的串口模式在方式2或方式3时为9位通讯方式,即当串行数据第9位为“1”时,前8位数据指示的是用来和主机通讯的从机地址;当串行数据第9位为“0”时,前8位数据则用为真正的数据。具体请参考:
而FriendlyARM的mini2440可以设置的数据位数为5~8位,即CS5,CS6,CS7,CS8。关于Linux串口的编程教学请参见:  http://www.adamjiang.com/pukiwiki/index.php?Linux串口编程详解#ec39e271 
查阅了一下前人的做法,有两种:1.硬方法:另加一51单片机的板子来做转换,串口模式采用方式1来与ARM板通信,另一头用方式2或3来与9bit的单片机通信;2.软方法:改驱动,即在linux的串口驱动中加入对第9位的收发。
我这里是用方法二。一开始很不想改driver,就在网上各种搜,搜到的方法是:采用奇偶校验的mask和space来设定第九位为“1”或“0”;串口的设置代码为:
发地址前: 
struct termios opt;
opt.c_cflag = BAUDRATE | CS8 | PARENB | PARODD | CMSPAR | CLOCAL | CREAD;
opt.c_iflag = (INPCK | IGNBRK | IGNPAR);
发数据前:
struct termios opt;
opt.c_cflag = BAUDRATE | CS8 | PARENB | CMSPAR | CLOCAL | CREAD;
opt.c_cflag &= ~PARODD; 
试过之后发现有时是9bit,有时是8bit,或者是第9bit不受mask和space的控制(测试方式很吐血,直接拿示波器看的,高低电平一个一个数!)。看来这样的设置只是设了奇偶校验,根本没设到mask和space,难道是driver不支持?只有这个原因了!于是开始学改driver,最后是在samsung.c这个驱动文件中发现虽然定义了CMSPAR,却完全没有用到,于是修改如下:
修改了如下几个文件:
1. ARM-Linux(mini2440)串口与51单片机的9位串口通讯
     加入如下两行:
          ARM-Linux(mini2440)串口与51单片机的9位串口通讯

2. ARM-Linux(mini2440)串口与51单片机的9位串口通讯
   函数 s3c24xx_serial_set_termios()中:
注释掉这个:  ARM-Linux(mini2440)串口与51单片机的9位串口通讯
修改ulcon寄存器设置,如下:
                    ARM-Linux(mini2440)串口与51单片机的9位串口通讯
      接着就是重新编译内核,通过vivi下载到板上。测试程序中按照上述方法设置结构体termios变量,就可以实现第9位的mask和space了。经测试,mini2440已可与51单片机通信!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值