SPI總線單片機發(fā)送數(shù)據(jù)的C51程序
關(guān)于spi協(xié)議見:http://hi.baidu.com/gilbertjuly/blog/item/0be222eeac9abae5cf1b3e38.html
ISD4002芯片資料參考:http://download.csdn.net/source/1208805
以下是單片機spi通信的通用程序,在不同晶振情況下可能需調(diào)整延時。這里單片機晶振為11.0592MHz。
_nop_();語句指延遲一個機器周期,約1us左右。寫1bit約10us,spi傳輸率約100kbit/s。
程序中只用了MOSI,/SS,SCLK信號,沒有用MISO信號。#include
#include
#include
#include
#include
sbitss=P1^0;
sbitmosi=P1^1;
sbitsclk=P1^4;
voiddelay_ms(unsignedintms)
{
unsignedchari;
while(ms--)
{
i=112;
while(i--);
}
}
voidspi_mosi(unsignedcharspi_da
{//發(fā)送一個字節(jié)數(shù)據(jù)
unsignedcharBitCnt;
mosi=0;
sclk=0;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
sclk=0;
_nop_();
if((spi_da
mosi=1;
else
mosi=0;
_nop_();
_nop_();
_nop_();
sclk=1;
_nop_();
_nop_();
_nop_();
}
_nop_();
_nop_();
_nop_();
}
voidplay_isd4002(unsignedintaddr)
{
unsignedcharaddr_l,addr_h;
addr_l=addr;
addr_h=addr>>8;
addr_h=addr_h|0xe0;
ss=0;
spi_mosi(0x20);
ss=1;
delay_ms(50);
ss=0;
spi_mosi(addr_l);//傳低位
spi_mosi(addr_h);//傳高位
ss=1;
delay_ms(10);
ss=0;
spi_mosi(0xf0);
ss=1;
}
voidstop_isd4002()
{
ss=0;
spi_mosi(0x70);//停止命令
ss=1;
delay_ms(50);
}
voidmain()
{
play_isd4002(0x86);//播放86地址開始的語音
}