嵌入式处理器Mpc860与单片机通信的设计与实现
摘 要:
介绍了32位嵌入式处理器MPC860 SPI接口。给出了MPC860与Atmega128单片机通信硬件电路连接图以及MPC860 SPI(串行外围设备接口)软件结构框图,设计了MPC860与ATmega128单片机通信的帧格式,实现了Mpc860与单片机的通信。
关键词:MPC860 单片机 串行外围设备接口
一、前言
MPC860是目前通信领域广泛应用的一款32位嵌入式通信处理器,内部集成了SPI接口。SPI接口是一种高速同步串行接口,有4条引脚,分别为SPISEL(片选线)、SPIMISO(主进从出)、SPIMOSI(主出从进)、SPICLK(串行时钟信号线)。SPI采用全双工通信方式同时发送和接受数据,支持主机模式和从机模式。主机为SPI数据传输的控制方,由主机将SPISEL管脚的电平拉低,作为同步数据传输的初始化信号,通知从机进入传输状态,然后主机启动发送过程,送出时钟脉冲信号。在时钟脉冲信号的同步下,数据收发同时进行,通过SPI接口,主机移位寄存器的数据移入到从机移位寄存器,同时从机移位寄存器中的数据移入到主机移位寄存器中,实现数据的传送。当数据传送完,主机将SPISEL(片选线)拉高,传输结束。由于SPI的发送和接收是同时进行的,实际都是以发送一个字节发起,只不过需要接收的时候发送的是一个没有实际意义的字节。SPI可以作为微处理器与单片机或者与外设芯片串行扩展接口。【1】
二、SPI驱动程序的编写
MPC860与ATmega128都支持SPI接口,因此可以采用SPI接口进行通信,硬件连接如图1所示。【1】,【2】
对MPC860 SPI 接口进行初始化,主要是针对相关寄存器进行操作。与SPI 相关的寄存器主要有SPMODE(SPI 模式寄存器), SPIE(SPI 事件寄存器),SPIM(SPI 屏蔽寄存器),SPCOM(SPI 命令寄存器)等。MPC860 寄存器的配置具体步骤如下:【1】
1 将管脚PB28,PB29,PB30 分别设置为SPIMISO、SPIMOSI、SPICLK 管脚。
PBPAR(28,29,30)= 1;PBDIR(28,29,30)= 1;PBODR(28,29,30)= 0;2 设置收发缓冲区描述符(BD)在双端口RAM 中的偏移位置。
SPI_RBASE = 0x2608;SPI_TBASE = 0x2600;3 执行初始化 RX、 TX 参数命令。
CPCR|=0x0051;4 初始化SDCR 寄存器,给予SDMA 的U 总线一个普通仲裁优先级。
SDCR =0x0001;5 设置RFCR 、TFCR 寄存器,使低地址存放最高有效字节;
SPI_RFCR=0x10;SPI_TFCR=0x10;6 设置MRBLR 寄存器,确定接收缓存区的最大接收空间;SPI_MRBLR =0x0080;7 初始化RxBD 、TxBD 寄存器,设置收发缓存区,并确定将要发送的数据长度。发送缓存区txbuf 放置需要通过SPI 发送的数据,接收缓存区rxbuf 放置通过SPI 接收到的数据。
SPI_RxBD_STATUS =0x3800;SPI_RxBD_RXBUFL=((UINT32)rxbuf&0xFFFF0000)>>16;SPI_RxBD_RXBUFH=((UINT32)rxbuf&0xFFFF);SPI_TxBD_STATUS=0x3800;SPI_TxBD_TXBUFL=((UINT32)txbuf&0xFFFF0000)>>16;SPI_TxBD_TXBUFH=((UINT)txbuf&0xFFFF);8 设置SPIE,清除任何当前事件; 设置SPIM,使能SPI 中断;SPIE=0x37;SPIM=0x00;9 设置SPMODE 寄存器,使MPC860 工作模式为主模式,并选择SPI 基本时钟BRGCLK。
SPMODE=0x0F74;10 设置SPI 命令寄存器SPCOM[STR],SPI 开始传输。将发送缓冲区的数据发送出去,数据长度由RxBD 寄存器决定,同时将收到的数据放置到接收缓存区。
SPCOM|=0x80;
三 、采用SPI 实现 MPC860 与单片机的通信
要实现MPC860与单片机数据的可靠传输,还要设计通信协议。在我们设计的通信控制板上,MPC860与ATmega128之间通过SPI接口相连。MPC860做主机,ATmega128做从机,SPICLK由MPC860产生。
MPC860与单片机之间的SPI通信帧格式如图2所示。第一个字节是SPI帧长度,包括所有的信息长度;第二个字节是SPI指令类型,分为SPI设置指令,SPI获取板卡状态指令,告警上报指令;第三至第n 字节为数据信息;最后两字节为CRC校验字节。
MPC860与单片机ATmega128通信时,MPC860将整个SPI帧发送出去,包括第一至第n+2字节。单片机接收在接收时先接收第一字节,根据帧长度字节判断SPI数据的长度,确定接下来要接收的数据长度,然后接收其他字节。在接收结束后进行CRC校验,如果失败则返回接收错误,如果成功则进行相应操作。
SPI指令类型包括设置指令和获取板卡状态指令。如果SPI指令类型为设置指令,单片机则接收SPI数据并进行设置相关操作,具体设置值在下次读取相应参数时就可显示。如果SPI指令类型为获取板卡状态指令,单片机根据指令类型要求,从相应寄存器读取数据并通过SPI发送到MPC860。SPI数据信息可以是板卡需要设置的数据,也可以是获取的板卡状态数据。
ATmega128与数字温度传感器、风扇控制器以及告警指示灯相连。在控制板上运行VXWORKS 操作系统以及基于SNMP协议的网管代理端软件。通过MPC860与ATmega128之间的SPI接口,代理端可以获取状态信息以及设置相应参数,例如可以控制风扇开启,可以获取当前数字温度传感器的温度,可以通过ATmega128设置温度告警临界值,当温度高于临界值时,温度告警指示灯亮,风扇自动开启。
代理端设置以及获取控制板相应参数,均采用消息队列机制。在设置控制板信息时,代理端发送的消息送至CONFIG消息队列排队,一旦SPI空闲,消息将被发送到MPC860的SPI发送缓冲区,然后经SPI接口向单片机发送消息。接收消息时,SPI将接收到单片机发送来的消息放置于接收缓存区,判断消息的合法性,如果符合接收消息的格式,发送至应答消息队列,由代理端去处理。如果不符合接收消息的格式,则丢弃该消息。通信机制如下图所示。
当单片机有告警信息需要上报时(产生异常),单片机相应引脚产生低电平信号,通过MPC860 IRQ3触发MPC860中断。MPC860收到中断后,根据不同的中断号执行不同的中断服务程序(ISR), 中断服务程序从单片机接收异常信息,发送到应答消息队列,由代理端处理。程序流程图如图4所示。
四、结束语
MPC860使用高速缓存,以解决CPU与低速存储器速度不匹配问题,但同时也带来了高速缓存与内存不一致问题【3】。在SPI通信中出现的问题是,通过SPI发送出去的数据总是RAM保存的旧数据,RAM内容得不到及时更新,要到下次发送时才能把上次需要发送的数据传送出去。解决方法是在发送前Flush相应内存,将cache内容强制写到RAM中。在接收时Invalidate 相应内存,访问接收数据时直接从RAM中获取。VxWorks操作系统提供了cacheFlush()和cacheInvalidate()函数。
采用SPI接口实现MPC860与单片机Atmega128通信,可以高速可靠地传送数据。在控制板上运行VxWorks嵌入式操作系统以及网络管理代理端应用软件,可以实现网管代理端与底层设备的通信。添加一些功能后,控制板就可以应用于通信设备或自动控制中。