SPI时钟值计算方法如下:SPI时钟 = fpclk/SPCCR,式中,SPCCR的值必须大于8的偶数。
主机SPI的基本操作方法如下:
1、设置I/O连接。2、设置SPCCR得到相应的SPI时钟。3、设置SPCR控制SPI为主机模式,并配置SPI时钟极性等。4、片选人机,将数据写入SPDR,将数据发送出去。5、等待SPIF置位,即数据发送完毕。6、取消坂,读取接收到的数据SPDR(可选)。
从机SPI的基本操作方法如下:
1、设置I/O连接。2、设置SPCR控制SPI为从机模式,并SPI时钟极性等。3、将要发送的数据写入SPIF(可选)4、等待SPIF置位,即接收到主机发送的数据。5、从SPDR中读取数据。
/*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/
#include "config.h"
#define HC595_CS 0x00000100 /*P0.8口为74HC595的片选*/
/*******************************************************************************
*名称: DelayNS()
*功能: 长软件延时
*******************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for (;dly>0;dly--)
for(i=0;i<50000;i++);
}
/*******************************************************************************
*名称: MSpiIni()
*功能: 初始化SPI接口,设置为主机
*******************************************************************************/
void MSpiIni(void)
{ SPI_SPCCR=0x52; //设置SPI时钟分频
SPI_SPCR=0x30; //设置SPI接口模式,MSTR=1,CPOL=1,CPHA=0,LSBF=0
}
/*******************************************************************************
*名称: MSendData()
*功能: 向SPI总线发送数据
*******************************************************************************/
uint8 MSendData(uint8 data)
{ IOCLR=HC595_CS; //片选
SPI_SPDR=data;
while(0==(SPI_SPSR&0x80)); //等待SPIF置位,即等待数据发送完毕
IOSET=HC595_CS;
return(SPI_SPDR);
}
/*此表为0~F的字模*/
uint8 const DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
0x88,0x83,0xC6,0xA1,0x86,0x8E};
/*******************************************************************************
*名称: main()
*功能: 使用硬件SPI接口输出0~F的数据,控制LED显示
*******************************************************************************/
int main(void)
{ uint8 rcv_data;
uint8 i;
PINSEL0=0x00005500; //设置SPI引脚连接
PINSEL1=0x00000000;
IODIR=HC595_CS;
MSpiIni(); //初始化SPI接口
while(1)
{ for (i=0;i<16;i++)
{rcv_data=MSendData(DISP_TAB[i]); //发送显示数据
DelayNS(50); //延时
}
}
return(0);
}