找回密码
 注册
搜索
查看: 862|回复: 0

[讨论] 基于SPI接口和MAX3100的高速串行红外通讯(分享)

[复制链接]
发表于 2008-4-12 10:24:34 | 显示全部楼层 |阅读模式
摘要:MAX3100是一种具有SPI接口和IrDA模式的通用异步收发器,而TFDU4100则是符合IrDA 1.2标准的低功耗连续红外数据收发模块,本文利用ATmega8单片机的SPI接口与MAX3100进行双向通信,由MAX3100与TFDU4100相连接可实现高达115.2kbps的红外数据通讯,文中给出了硬件连接电路及C语言实例。

MAX3100是一种具有SPI接口的IrDA模式的通用异步收发器,在MCS-51单片机应用系统中,由于51系列单片机没有SPI接口,需要软件模拟SPI功能,没有充分利用MAX3100的SPI功能,而ATmega8具有高速SPI和UART口,可以充分发挥MAX3100的功能,实现高速串口与高速红外之间的通讯。本文就SPI接口、MAX3100及TFDU4100在使用中的相关问题进行了探讨。

一、ATmega8的SPI接口

ATmega8是AVR单片机家族中的一员,具有RISC结构,工作于16M晶振时具有16MIPS性能,同时具有8K字节的片上闪存,1K字节的片上SRAM及512字节的片上EEPROM,两路USART接口及可工作于主从方式的SPI接口。有关ATmega8的其他特性请参考相关资料,本文只对用到的SPI接口进行说明。串行外设接口SPI允许ATmega8和外设(或其他器件)进行高速的同步数据传输,主机与从机(或外设)的连接方式如图1所示:
http://www.51kaifa.com/upload/eWebUpload/200706/20070620093941631.gif
图1

由图可知:系统包括两个移位寄存器和一个主机时钟发生器。通过将从机的/SS引脚拉低,主机启动一次通讯过程。主机和从机将需要发送的数据放入相应的移位寄存器。主机在SCK引脚上产生时钟脉冲以交换数据。主机的数据从主机的MOSI移出,由从机的MOSI移入;从机的数据由从机的MISO移出,由主机的MISO移入。主机通过将从机的/SS拉高实现与从机的同步。本系统中初始化ATmega8为主机方式,图中的MOSI为ATmega8的PB3脚,MOSI为PB4脚,SCK为PB5脚。/SS脚内部拉高。SCK是由主系统时钟分频得来,本系统时钟使用ATmega8内部时钟8MHz,其分频系数为16,故SCK的时钟频率为500KHz。故对ATmega8的SPI接口初始化如下:

void SPI_MasterInit(void)

{  DDRB = 0x2C;          //PB5,PB3为输出,PB4为输入,/SS脚未用

  SPCR =(1<<SPE)|(1<<MSTR)|(1<<SPR0); //0x51,SPI允许,主模式,16分频

  SPSR = 0x00;  }      //状态寄存器清零

根据上述SPI对两个移位寄存器的描述,如果把SPI看作主从设备间一个16位循环移位器,则主模式下发送一个字节和读取一个字节的SPI的操作可以统一为:

unsigned char SPI_TranByte(unsigned char cData)
{  SPDR=cData;

while(!(SPSR&(1<<SPIF))); //如果SPIF=1,表示SPI传输(一个字节)操作完成

return SPDR;}

二、MAX3100的工作原理、引脚及控制字

1、工作原理:MAX3100包含一个简单的UART和波特率发生器,以及SPI接口和中断发生器,写入控制字设置UART的波特率、数据字长、校验使能、四个中断屏蔽位、普通模式或IrDA模式。波特率可被设置于300到230K波特间,通过写配置寄存器的分频比对晶振频率进行分频。MAX3100的振荡器可选用1.8432MHz或3.6864MHz的晶体,也可由X1端输入占空比45%到55%的外部时钟。在MAX3100中,可发出4种中断请求信号:奇偶校验中断、接收中断、帧错误/(待机接收)中断、发送中断。可根据需要对中断屏蔽位(/TM、/RM、/PM,/RAM)进行设置,选择相应的中断方式,



2、引脚说明:MAX3100有DIP和QSOP两种封装,以DIP封装为例,它的引脚排列如图2所示

1) DIN:串行数据输人端。串行时钟的上升沿锁存 DIN 数据。

2) DOUT:串行数据输出端。数据由串行时钟的下降沿同步输出,当/CS为高时为高阻态。

3) SCLK:串行时钟输入端。

4) /CS:片选控制。/IRQ,/RTS,TX的输出不受/CS的控制。

5) /IRQ:中断请求信号。低电平有效。

6) /SHDN:待机模式的硬件控制端。/SHDN=0,进入待机模式,片

内振荡器立即停振。  

7) XI和X2:晶振引脚。

8) /CTS:输人端。低电平有效,用于RS-232作允许发输入端。

9) /RTS:输出端。低电平有效,用于RS-232作请求发送输出端

或RS-485驱动器使能端。

10) RX:接收输人端        11) TX:发送输出端

http://www.51kaifa.com/upload/eWebUpload/200706/20070620094130591.gif
3、读写控制字及数据: 微控制器通过SPI接口与MAX3100进行数据交换,每次都要写入16位数据,同时移出16位数据。共有4种命令,主要区别在于其最高两位的值,分别为:写控制字(D15=1,D14=1)、读控制字(D15=0,D14=1)、写数据(D15=1,D14=0)、读数据(D15=0,D14=0)。

1) 写控制字  各位含义控制字写控制字各位含义如Table 1 所示。控制字写人后将清除FIFO寄存器以及R、T、RA/FE、D0r~D7r、D0t~D7t、Pr、Pt等寄存器,而/CTS和/RTS保持不变。屏蔽位/TM、/RM、/PM、/RAM和RAM在SCLK的第16个时钟的上升沿有效,而/FEN、SHDNi、IR、ST、PE、L、B0~B3 在完成写配置操作后有效。



Table 1.Write Configuration (D15, D14=1, 1)
BIT 15  14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
DIN 1 1 /FEN SHDNi /TM /RM /PM /RAM IR ST PE L B3 B2 B1 B0
DOUT R T 0 0 0 0 0 0 0 0 0 0 0 0 0 0


2) 读控制字 从MAX3100读回的控制字如Table 2 所示,读控制字同时还可以通过配置命令最低位TEST=1,使器件进入测试状态,此时TX和RX构成回路,完成自发自收的操作。

Table 2.Read Configuration (D15, D14=0, 1)
BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
DIN 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 TEST DOUT R T /FEN SHDN0 /TM /RM /PM /RAM IR ST PE L B3 B2 B1 B0


3) 写数据 如Table 3 所示,要发送的数据写入数据寄存器,16位字中的最后7位或8位是实际发送的数据。如果只想改变/RTS的状态而不发送数据,可通过/TE禁止数据的发送。

Table 3.Write Data (D15, D14=1, 0)
BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
DIN 1 0 0 0 0 /TE RTS Pt D6t D6t D5t D4t D3t D2t D1t D0t
DOUT R T 0 0 0 RA/FE CTS Pr D7r D6r D5r D4r D3r D2r D1r D0r


4) 读数据  从MAX3100读得的数据如Table 4 所示,在读数据的同时将清除R和/IRQ。

Table 4.Write Data (D15, D14=0, 0)
BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
DIN 0 0 0 0 0 /TE 0 0 0 0 0 0 0 0 0 0
DOUT R T 0 0 0 RA/FE CTS Pr D7r D6r D5r D4r D3r D2r D1r D0r


http://www.51kaifa.com/upload/eWebUpload/200706/20070620094204302.gif

图3

向MAX3100写人数据时,在DIN写入的是一个16 bit的字,其中高八位设置的内容是:写人标志、允许 TX 输出、RTS 引脚设定以及传送校验位设定。低八位才是要传送的数据。从MAX3100读出数据时,仍旧要在DIN写人一个16 bit的字(OOOOH),再从DOUT读人16 bit的字,其中的高八位是:接收/发送缓冲区的状态,数据错/溢出状态,接收/校验位状态和CTS的状态,低八位才是接收到的数据。值得注意的是:由于MAX3100采用的是全双工通信,即DIN, DOUT引脚上同时有数据传送。在SCLK时钟的下降沿,将数据从DOUT引脚发送出去,在SCLK时钟的上升沿,从DIN引脚接收数据。读写数据时序图如图3所示。



三、  应用实例

本设计采用基于AVR内核的ATmega8单片机(具有两个可编程的串行USART、可工作于主机/从机模式的SPI串行接口)作为控制器通过SPI接口收发红外数据,通过MAX232电平转换后与9针串行接口相连用以与计算机通讯,MAX3100采用IrDA通讯模式。

1、 硬件设计: 如图4所示上位机传过来的数据通过串行口由232转换TTL电平后,

经ATmega8的USART串行输入到MCU,ATmega8启动SPI时钟SCK将数据送入MAX3100,经红外收发器TFDU4100送出。当MAX3100收到TFDU4100传来的有效数据后/IRQ变成低电平触发ATmega8

的外部中断INT0,MCU开始接受数据,并串行传输到上位机。


http://www.51kaifa.com/upload/eWebUpload/200706/20070620094231652.gif

2、 软件设计

MAX3100写配置函数初始化函数:/FEN为FIFO使能位,/FEN=0时FIFO使能,在本系统中FIFO是否使能没有影响。SHDNi为软件Shutdown位,系统中不使用,SHDNi=0 。中断屏蔽位/TM、/RM、/PM、/RAM, 对应奇偶校验中断、接收中断、帧错误/(待机接收)中断、发送中断。根据需要进行设置,选择相应的中断方式,设计中只使用接收中断因此/RM= 1。IrDA模式使能位。系统中使用IrDA模式,IR=1。ST传输停止位,ST =0,1位停止位,ST=1两位停止位,系统中使用两位停止位ST=1。PE奇偶校验。不使用PE=0。L设定数据位长度L=0,7位数据;L=1,8位数据。系统中采用8位数据长度,L=1。B3~B0设置传输波特率。系统中MAX3100采用3.6864MHz晶振,传输速率115.2kbit/s。对应B3~B0设为0001。经过上边分析,写配置寄存器为0xe4、0xc1。

void inimax3100(void)

{  PORTC&=0xfe;      //MAX3100片选 低电平有效

    SPI_TranByte(0xe4);// 0xe4  禁止FIFO,开IRQ中断;0xc4允许FIFO

SPI_TranByte(0xc1);//波特率115.2K,IrDA模式,8位数据,无校验,2位停止位

  PORTC|=0x01;  }    //取消片选  

USART中断服务程序:接受上位机数据。

#pragma interrupt_handler uart0_rx_isr:12

void uart0_rx_isr(void)

{  comm=UDR; }    //接收上位机发来的数据

外部中断INT0 服务程序:读取MAX3100数据

#pragma interrupt_handler int0_isr:2

void int0_isr(void)

{  SPI_TranByte(0x00);          //读数据先向MAX3100写入0000H

        data=SPI_TranByte(0x00);  }  //低八位是要接收的有效数据

MAX3100接收到数据后触发外部中断INT0,同样定义外部中断标志量flag,在接收MAX3100数据时先要通过SPI向MAX3100写入0000H。接收到的数据中高8位是相应的状态标志量,只有低8位是要接收的有效数据。存在变量data中(data为全局变量)。

通过SPI向MAX3100发送数据函数:

void SPIsend_MAX3100(void)

{ SPI_TranByte(0x80); //高八位控制字,允许发送

SPI_TranByte(comm); }//低八位数据comm来自上位机

控制字含义:/TE为发送使能位,当/TE=0时在/CS上升沿时RTS, Pt,D0t–D7t内容发送。其中RTS是请求发送允许位,MAX3100收到数据后立刻发送出去。Pt是奇偶校验位,本系统中不使用,D7t~D0t是要发送的8位数据,系统通过SPI将数据发送到红外传输模块TFDU4100。

程序设计时要注意:大批量的数据接收时,由于此例程中MAX3100收发的红外数据速度是115.2kbps,而ATmega8与计算机通讯速度是19.2kbps,大批量数据接收时由于串口来不及向计算机发送会出现数据丢失现象,这种情况可以采取如下方法来解决:

(1)由于本系统MCU用的是ATmega8内部8M振荡器,所以串口速度不能太高,可以在每次SPI接收数据时加适当的延时,就可以解决这个问题;

(2)由于ATmega8具有1K字节的片上SRAM,因此可以开辟一个较大的数据缓冲区,如512字节,将收到的数据先暂放到缓冲区中,然后再将数据依次发送出去,只要每次传输的数据个数不大于该缓冲区,就不会有数据的溢出;

(3)ATmega8外接11.0592MHz的晶振,使串口速度达到115.2kbps,则可以与红外数据传输率相匹配,达到高速传输数据的目的。

四、结论

采用MAX3100作为扩展UART,具有价格低廉,功耗小,容易实现的特点,而且传输速度快,工作频率高的优越性能,特别是该芯片具有红外模式,可以简化红外设计。前面所给的程序对于任何一种具有SPI功能的单片机使用MAX3100实现串行收发的应用系统来说都是有帮助的。实践证明,该系统运行效果良好,数据传输安全可靠。

本文作者创新点:首先,采用了具有红外模式的通用异步接收/发送器MAX3100,简化了红外设计;其次,使用了ATmega8单片机的SPI接口与MAX3100相连,不需要使用软件模拟SPI功能,简化了程序设计,提高了程序的执行效率。



参考文献:

[1] MAXIM Company, Data Book[S].1999.

[2] 沈文,Eagle lee,詹卫前. AVR单片机C语言开发入门指导. 清华大学出版社. 2003.5

[3] 王瑞兰,马云峰.MAX3100在红外通讯中的应用[J].微计算机信息. 2000.5
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-10-4 18:40 , Processed in 0.046724 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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