以下的设置,有没有毛病? 是不是 0xEC 才对?
void spi_comm_init()
{
SPCTL = 0xFC; // SSIG,SPEN,DORD,MSTR,CPOL,CPHA,SPR1,SPR0。 1110,1100
我用的也是宏晶的单片机,这个是我的一小段程序,希望对你有帮助
//
//功能:SPI初始化
void init_spi(void)
{
SPCTL=0xd0; //设置1101,0000
SPSTAT=0xc0; //标志位写1清零
}
//
//功能:SPI对从机写一个字节
void spi_write(unchar x)
{
SPDAT=x;
while(!(SPSTAT&0x80)); // 等待SPIF = 1,传输完成
SPSTAT = 0xc0;
}
//
//功能:SPI对从机读一个字节
unchar spi_read()
{
unchar temp=0;
SPDAT=0xaa;
while(!(SPSTAT&0x80)); // 等待SPIF = 1,传输完成
temp=SPDAT;
SPSTAT = 0xc0;
return(temp);
}
某温度数据采集系统有主、从机进行串行通讯,假定双机的系统时钟频率fosc=110592MHz,通讯速率9600bps,主机每次将温度数据temperature的值发送给从机,从机则将收到的数据送到显示器上显示,试完成双机通信程序设计。
分析:设定时器1工作于方式2,TMOD=00100000b=0x20。
定时器的初值计算:9600=Kfosc/[3212(256-TH1)],这里设SMOD=0,则K=1。fosc=110592MHz,计算得到:TH1=253=0x0fd。
SCON的确定:串口工作在方式1,允许接收。 所以: SCON=01010000b=0x50。
主机采集数据,并发送给从机的参考程序如下(这里没有考虑通信协议):
#include<reg51h>
#define uchar unsigned char
#define uint unsigned int
uchar Temperature;
void InitSystem(void);
void CollectData(void);
void Delay(void);
/系统初始化/
void InitSystem(void)
{
TMOD=0x20; / T1工作于方式2/
TH1=0xfd; / 通信速率2400bps/
TL1=0xfd;
PCON=0x00; / SMOD=0/
SCON=0x50; / 允许接收/
ES=0; / 开串口中断/
ET1=0;
TR1=1; / 启动定时器1/
RI=0;
TI=0;
}
void CollectData(void) /数据采集程序/
{;
// 此程序将采集的温度数据送入Temperature变量,限于篇幅,省去该程序代码。
}
void Delay() /延时子程序/
{
int i;
for(i=0;i<10000;i++);
}
void main(void)
{
InitSystem();
while(1)
{
Delay();
SBUF=Temperature; /发送温度数据/
while(!TI);
TI=0;
CollectData(); / 采集温度数据/
}
}
从机程序如下:
#include<reg51h>
#define uchar unsigned char
#define uint unsigned int
uchar Temperature;
void InitSystem(void);
void Comm(void) ;
void Display(void);
void InitSystem(void) /系统初始化程序/
{
TMOD=0x20; / T1工作于方式2/
TH1=0xfd; / 通信速率2400bps/
TL1=0xfd;
PCON=0x00; / SMOD=0/
SCON=0x50; / 允许接收/
EA=1;
ES=1; / 开串口中断/
ET1=0;
TR1=1; / 启动定时器1/
RI=0;
TI=0;
}
void Comm(void) interrupt 4 using 0 /串行中断服务程序/
{
Temperature=SBUF; / 保存数据/
RI=0; /清中断标志/
}
void Display(void) /显示程序/
{
;
/此程序将收到的Temperature 通过显示器显示出来 /
}
void main(void)
{
InitSystem();
while(1)
{
Display();
;
}
}
注意:晶振和波特率一定按照程序中给出的那样设置,否则会有很大的误码率导致通信失败。。。程序中用的是110592你就别用12M的,否则你就等着后悔吧
用传统的51单片机实现SPI通讯,需要用I/O脚来模拟SPI协议,这比较麻烦。
选用STC8系列单片机,就具有了SPI接口了 ,只需要对寄存器 *** 作就行了。方便了很多了。如下图,这是STC8系列中的4个子系列,还有其它的子系列,就不再列举了。
建议楼主参考一下SPI总线的四种工作模式,然后看一下你的 从设备用的是SPI总线的哪种工作模式
工作模式和你程序里面的SCK变化是有关系的
SCK代表主设备模拟SPI总线协议里的时钟信号,而循环里的dat移位 *** 作实际为在时钟是什么时候进行采样
参考网址:
>
以上就是关于STC单片机的硬件SPI问题全部的内容,包括:STC单片机的硬件SPI问题、知道STC12C2052AD单片机怎么初始化SPI的来帮帮忙啊、我想用一个单片机去控制另外一个单片机,如何连接以及相应的数据处理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)