S3C2440的SPI解析
扫描二维码
随时随地手机看文章
S3C2440A的串行外设接口(SPI)可以与串行数据传输连接。S3C2440A包含了2个SPI,每个都有2个分别用于发送和接收的8位移位寄存器。一次SPI传输期间,同时发送(串行移出)和接收(串行移入)数据。由相应控制寄存器设置指定8位串行数据的频率。如果只希望发送,则接收数据可以保持伪位(dummy)。此外如果只希望接收,则需要发送伪位'1'数据
使用SPI主要需要以下寄存器
选择SPI模式,中断模式,查询模式等SCK选择,主从机选择以及GPOL GPOA选择,关于GPOL与GPOA的描述请查看SPI协议手册
选择SPI时钟,SPI挂在PCLK上,具体计算公式如下
针对数据传输完成之后的SPI总线状态做一个选择
传输数据时,数据分别存在与两个寄存器中
同时,在传输过程中查看是否发送完成或者接收完成应该看这个寄存器
另外,在SPI通讯过程中如果希望只写不读,应该发送0XFF,这样才能产生SPI时钟
示例代码如下
SPI.C
#include"spi.h"voidSPI0IoInit(void){//SPI0为主设备//初始化GPEGPE11:MISO0(MISO);GPE12:MOSI0(MOSI);GPE13:SPICLK0(SCK)//对三个引脚的的配置清零rGPECON&=~((3<<26)"(3<<24)|(3<<22));//配置为第二功能rGPGCON|=((2<<26)|(2<<24)|(2<<22));}voidSPI0Init(void){SPI0IoInit();//设置时钟控制寄存器(CLKCON),使能SPI时钟//rCLKCON=(rCLKCON&~(1<<18))|(1<<18);//设置波特率预定标器寄存器(SPPREn),波特率=PCLK/2/(预定标器值+1)//预订频率为1MrSPPRE0=(PCLK/2/1000000)-1;//设置SPCONn寄存器以正确配置SPI模块//normal;formatA;activehigh;master;enable;pollingmoderSPCON0&=~(0x7f);//清零//时钟使能主机模式查询模式低电平有效格式A普通模式rSPCON0|=((1<<4)|(1<<3));//设置SPI引脚控制寄存器(SPPINn)//禁止多主机模式,发送完成释放MOSIrSPPIN0&=~((1<<2)|(1<<0));}u8SPI0RWData(u8dat){u8retry=0;u8temp=0;while(!(rSPSTA0&0x01))//等待数据传输就绪{retry++;if(retry>200)return0;}rSPTDAT0=dat;//传输数据while(!(rSPSTA0&0x01))//等待数据传输就绪{retry++;if(retry>200)return0;}temp=rSPRDAT0;returntemp;}
SPI.H
#ifndef__SPI_H#define__SPI_H#include"2440addr.h"#include"def.h"#include"clock.h"voidSPI0IoInit(void);voidSPI0Init(void);u8SPI0RWData(u8dat);#endif