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" void SPI0IoInit(void) { // SPI0为主设备 // 初始化GPE GPE11:MISO0(MISO);GPE12:MOSI0(MOSI);GPE13:SPICLK0(SCK) //对三个引脚的的配置清零 rGPECON &= ~((3<<26)|(3<<24)|(3<<22)); //配置为第二功能 rGPGCON |= ((2<<26)|(2<<24)|(2<<22)); } void SPI0Init(void) { SPI0IoInit(); // 设置时钟控制寄存器(CLKCON),使能SPI时钟 //rCLKCON = (rCLKCON & ~(1 << 18)) | (1 << 18); // 设置波特率预定标器寄存器(SPPREn),波特率 = PCLK / 2 / (预定标器值 + 1) //预订频率为1M rSPPRE0 = (PCLK/2/1000000) - 1; // 设置SPCONn寄存器以正确配置SPI模块 // normal; format A; active high; master; enable; polling mode rSPCON0 &= ~(0x7f); //清零 //时钟使能 主机模式 查询模式 低电平有效 格式A 普通模式 rSPCON0 |= ((1<<4)|(1<<3)); // 设置SPI引脚控制寄存器(SPPINn) // 禁止多主机模式,发送完成释放MOSI rSPPIN0 &= ~((1<<2)|(1<<0)); } u8 SPI0RWData(u8 dat) { u8 retry=0; u8 temp = 0; while (!(rSPSTA0 & 0x01)) //等待数据传输就绪 { retry++; if(retry>200)return 0; } rSPTDAT0 = dat; //传输数据 while (!(rSPSTA0 & 0x01)) //等待数据传输就绪 { retry++; if(retry>200)return 0; } temp = rSPRDAT0; return temp; }
SPI.H
#ifndef __SPI_H #define __SPI_H #include "2440addr.h" #include "def.h" #include "clock.h" void SPI0IoInit(void); void SPI0Init(void); u8 SPI0RWData(u8 dat); #endif