
SCI 是 serial communication interface 的缩写,也就是串行通信接口的意思。所谓 串行,就是数据在发送和接受的时候,是一位一位进行的,当然对于我们编程来说, 这些对我们没有影响。
先说说串口通信的硬件设计吧,单片机出来的 SCITX 和 SCIRX 都是 0V 或 5v 而 电脑的串口电平我原来测试过,是+10V 或-10V,他们两个不能直接连接,所以需要 一个电平转换芯片,通常我们采用 MAX232. TXD0 接到单片机串口发送端,RXD0 接到单片机接收端,DB_TX 接到九针插头 的 2 脚,DBRX 接 3 脚,GND 接 5 脚,九针插头和电脑连接,这样单片机和计算机 就能通信啦。 怎么在电脑上看串口接收到的数据呢,这时就需要一款串口调试软件,我在资料 里面给了。
好了下面将单片机编程。 要实现串口通信,最关键的就是实现波特率的匹配,也就是传输速度要一致,电 脑设置串口波特率为 9600,你单片机就要设成 9600 才能通信,当然你设成 9601 也问 哈工大嵌入式开发 hitele.taobao.com 题不大,不是 100%精确才能通信的,尽量吧! 手册 420 页中给出了串口波特率设置公式: SCI bus clock 就是以前提到的 f BUS ,在前面定时器和 PLL 实验中都讲过,PLL 实 验中我们将 f BUS 设置成了 40M。 SCIBR[12:0]由 SCIBDH 和 SCIBDL 决定(手册中 406 页),这 SCIBDH 设置 [12:8],SCIBDL 设置[7:0],一共 13 位。 假如我们现在要设置波特率为9600,怎么设置呢? 9600=40 000 000 /(16*SCIBR[12:0]) SCIBR[12:0]= 40 000 000 /16/9600 =260 260的十六进制是104H,也就是SCIBDH=0x01,SCIBDL=0x04. 除了波特率寄存器外,还有两个寄存器比较重要,SCI0CR1和SCI0CR2 LOOPS置1:SCI的发送端在内部直接接到SCI的发送端,也就是自发自收,这主要用来编程 期间对程序进行测试。清0就进入正常模式。 M=0: SCI总线发送了1个起始位 8个数据位和一个结束位 M=1: SCI总线发送了1个起始位 9个数据位和一个结束位 PE=1:启用奇偶校验 PE=0:禁止奇偶校验 PT用来选择是采用奇校验还是偶校验。 关于奇偶校验您可以百度一下,这里不做阐述了。 哈工大嵌入式开发 hitele.taobao.com TIE=1:使能发送数据为空中断,也就是现在发送数据寄存器可以接收新数据了,你可以发 送新数据了。 TCIE=1:使能发送完成中断,告诉你发送结束啦 RIE=1:使能接收中断 TE=1:发送使能 RE=1:接收使能 最后一个重要的寄存器就是状态寄存器SCI0SR1 TDRE=1:标志着可以进行新的数据收发了 RDRF=1: 标志着接收到了新数据 实际应用: 利用单片机每隔400ms 向电脑发送一次“hitele”,每次接收到PC 发送来的数据时,改 变led 状态。 每隔400ms,利用前面讲过的定时器,回顾一下吧。 串口发送编程: 1. 先对SCI 初始化 SCI0BDH =0x01SCI0BDL =0x04//将波特率设置为9600,注意这是在f BUS 为40M的情况下设 定的 SCI0CR1 = 0x64//设置串口接收端连接到外部; SCI0CR2 = 0x2C//启用接收中断;发送使能和接收使能 2. 发送函数 void Sci0SendByte(unsigned char data) { while(!(SCI0SR1&0X80))//等待 TDRE 为置 1,也就是等待什么时候可以发送 新数据 SCI0DRL = data//向数据寄存器写入要发送的数据,这样就发送出去了 } 3. 接收函数 查询式接收: 哈工大嵌入式开发 hitele.taobao.com unsigned char Sci0Read() { while(!SCI0SR1_RDRF);//一直等待接收数据,直到接收到 SCI0SR1_RDRF=1//读取数据寄存器会将RDRF 清除 重新置位 return SCI0DRL//返回数据寄存器的数据 } 中断方式接收数据: #pragma CODE_SEG NON_BANKED void interrupt 20 SCI0_RE(void) { SCI0SR1_RDRF=1SCI0DRL//这两步是为了清除中断标志 DDRE |=0x60/*0xC0=0110 0000,即将PE5、PE6 设置成输出模式*/ PORTE =~PORTE/*改变led 状态*/ }
飞思卡尔单片机SCI是个全双工异步通讯接口,不设置主从也可以通讯,但一般用在点对点通讯;在多机系统中,考虑通讯的可靠、准确,在线路上只有发送时只有一个单片机发送,不会在总线上发生混乱,所以要定义主、从关系;一般起始发送指令的单片机,为主;其它为辅。根据你系统中的上下关系也可以定义。主发指令向从机执行,或者要求从机发送数据回,协议根据系统要求设置。看了你的程序,有两个问题:1. 你的中断程序里面有个PTG=0x40和0x00是做什么用的,从你的注释来看,是不是用来设置传输和接收状态转换的(这个有点奇怪)?
你的中断程序应该是接收数据后产生中断,然后将相同的数值发出去。这里我假设发送、接收通过PTG控制,这里我假设PTG=0就会disable发送,SCI1DRL=data可以看作启动发送,可是还没有发送完PTG=0就会disable发送了。
可以在PTG=0前面再加判断TC看看是否发送已经完成。(这个是基于PTG控制收发的基础得到的结论,希望对你有帮助)
2. 你的断点设置在哪里,收发成功?如果在PTG=0x00还没有执行之吗?
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)