ARM7單片機(jī)(學(xué)習(xí)ing)—(六)、SPI接口—02
六、SPI接口
六—(02)、SPI控制數(shù)碼管(程序里有詳細(xì)的步驟~~以及注意事項(xiàng)~~)
程序:
MDK6_1.c
//------------------------------------------------------------------------------
//SPI控制數(shù)碼管顯示
//首先還是先介紹一下大概的操作流程~~
//SPI時(shí)鐘值計(jì)算如下:SPI時(shí)鐘=Fpclk/SPCCR,式子中,SPCCR的值必須大于8的偶數(shù)
//------------------------------------------------------------------------------
//主機(jī)SPI的基本操作方法如下:
//1)設(shè)置I/O連接
//2)設(shè)置SPCCR得到相應(yīng)的SPI時(shí)鐘
//3)設(shè)置SPCR控制SPI為主機(jī)模式,并配置SPI時(shí)鐘的極性等~~
//4)片選從機(jī),將數(shù)據(jù)寫(xiě)入SPDR,然后將數(shù)據(jù)發(fā)送出去
//5)等待SPIF置位,既數(shù)據(jù)發(fā)送完畢
//6)取消從機(jī)選擇,讀取接受的數(shù)據(jù)SPDR(可選)~~
//------------------------------------------------------------------------------
//從機(jī)SPI的基本操作方法如下:
//1)設(shè)置I/O連接
//2)設(shè)置SPCR控制SPI為從機(jī)模式,并且配置SPI時(shí)鐘極性等~~
//3)將要發(fā)送的數(shù)據(jù)寫(xiě)入SPDR(可選)~~
//4)等待SPIF置位,既接收到主機(jī)發(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()
//主機(jī)初始化SPI接口
void master_spi_init()
{
S0SPCCR=0x52;//設(shè)置SPI時(shí)鐘分頻
S0SPCR=0x30;//這里得好好說(shuō)說(shuō):
//設(shè)置SPI控制寄存器:SPIE為0,既SPI中斷被禁止
//LSBF為0,既SPI數(shù)據(jù)傳輸MSB(bit7)在先
//MSTR為1,既SPI處于主機(jī)模式
//CPOL為1,既時(shí)鐘極性的控制。該位為1,既SCK的低電平有效
}
//------------------------------------------------------------------------------
//master_send_data()
//主機(jī)向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中斷標(biāo)志,中斷標(biāo)志位于SPINT寄存器中
IOSET=HC595_CS;//取消片選
return(S0SPDR);//這里也要注意:SPI實(shí)際上也就是一個(gè)16位的數(shù)據(jù)的一個(gè)循環(huán),也就是主機(jī)和從機(jī)數(shù)據(jù)的交換
}
//------------------------------------------------------------------------------
//main()
int main()
{
uchar receive_data;
uchar i;
PINSEL0=0x00005500;//設(shè)置SPI引腳連接
PINSEL1=0x00000000;
IODIR=HC595_CS;//設(shè)置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);
}
}
}