STC单片机的硬件SPI问题

STC单片机的硬件SPI问题,第1张

以下的设置,有没有毛病? 是不是 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的来帮帮忙啊、我想用一个单片机去控制另外一个单片机,如何连接以及相应的数据处理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9337422.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存