六、SPI接口
六—(02)、SPI控制數(shù)碼管(程序里有詳細的步驟~~以及注意事項~~)
程序:
MDK6_1.c
//------------------------------------------------------------------------------
//SPI控制數(shù)碼管顯示
//首先還是先介紹一下大概的操作流程~~
//SPI時鐘值計算如下:SPI時鐘=Fpclk/SPCCR,式子中,SPCCR的值必須大于8的偶數(shù)
//------------------------------------------------------------------------------
//主機SPI的基本操作方法如下:
//1)設置I/O連接
//2)設置SPCCR得到相應的SPI時鐘
//3)設置SPCR控制SPI為主機模式,并配置SPI時鐘的極性等~~
//4)片選從機,將數(shù)據(jù)寫入SPDR,然后將數(shù)據(jù)發(fā)送出去
//5)等待SPIF置位,既數(shù)據(jù)發(fā)送完畢
//6)取消從機選擇,讀取接受的數(shù)據(jù)SPDR(可選)~~
//------------------------------------------------------------------------------
//從機SPI的基本操作方法如下:
//1)設置I/O連接
//2)設置SPCR控制SPI為從機模式,并且配置SPI時鐘極性等~~
//3)將要發(fā)送的數(shù)據(jù)寫入SPDR(可選)~~
//4)等待SPIF置位,既接收到主機發(fā)送的數(shù)據(jù)
//5)從SPDR中讀取數(shù)據(jù)
//------------------------------------------------------------------------------
//使用SPI接口向74HC595發(fā)送數(shù)據(jù)
//控制數(shù)碼管顯示
//------------------------------------------------------------------------------
#include"lpc210x.h"
#include"macroandconst.h"
#include"delay.h"
//------------------------------------------------------------------------------
#define HC595_CS 0x00000100//P0.8口為74HC595的片選
uchar const seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//------------------------------------------------------------------------------
//master_spi_init()
//主機初始化SPI接口
void master_spi_init()
{
S0SPCCR=0x52;//設置SPI時鐘分頻
S0SPCR=0x30;//這里得好好說說:
//設置SPI控制寄存器:SPIE為0,既SPI中斷被禁止
//LSBF為0,既SPI數(shù)據(jù)傳輸MSB(bit7)在先
//MSTR為1,既SPI處于主機模式
//CPOL為1,既時鐘極性的控制。該位為1,既SCK的低電平有效
}
//------------------------------------------------------------------------------
//master_send_data()
//主機向SPI中線發(fā)送數(shù)據(jù)
uchar master_send_data(uchar dat)
{
IOCLR=HC595_CS;//片選
S0SPDR=dat;
while((S0SPSR&0x80)==0);//等待SPIF置位,既等待數(shù)據(jù)發(fā)送完畢
//這里一定要注意:SPIF不是SPI中斷標志,中斷標志位于SPINT寄存器中
IOSET=HC595_CS;//取消片選
return(S0SPDR);//這里也要注意:SPI實際上也就是一個16位的數(shù)據(jù)的一個循環(huán),也就是主機和從機數(shù)據(jù)的交換
}
//------------------------------------------------------------------------------
//main()
int main()
{
uchar receive_data;
uchar i;
PINSEL0=0x00005500;//設置SPI引腳連接
PINSEL1=0x00000000;
IODIR=HC595_CS;//設置HC595的I/O口方向位輸出,其它為輸入
master_spi_init();
while(1)
{
for(i=0;i<16;i++)
{
receive_data=master_send_data(seg[i]);//發(fā)送顯示數(shù)據(jù)
delay_nms(1000);
}
}
}