以下是单片机spi通讯的通用程序,在不同晶振情况下或许需调整延时。这儿单片机晶振为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_data)
{//发送一个字节数据
unsignedcharBitCnt;
mosi=0;
sclk=0;
for(BitCnt=0;BitCnt《8;BitCnt++)
{
sclk=0;
_nop_();
if((spi_data》》BitCnt)&0x01)
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地址开端的语音
}