大家好,我是一个单片机自学新人。没有导师,很多问题光靠百度是解决不了的。每个人遇到的问题都不一样。偶然看到电子发烧友网站。希望在这里可以得到大家的提点。
这两天我在实验SPI通讯。用了两片STC12C5A60S2(网上申请的样片),自带SPI硬件接口的。
本想达到的目的是。其中一个芯片做主机,另外一个做从机。
主机由UART串口发送一个数据,通过SPI串口发送到从机,
从机收到数据后用1602液晶显示出来,并且向主机返回接收到的数据,然后
在串口小助手里显示从机返回的值。
可是在主机发送程序端就出现了问题。
我通过几处添加串口小助手接收子程序UART_SendByte()
发现问题出在,向SPDAT写入数据时,无法写进数据。
SPDAT总是0XFF。
下面是主机程序。能帮我分析一下,为什么写不进去吗?还有那个CPU_CLK/16分频
file:///D:QQ消息保存位置605106547Imagem1)3]%rnby~d1b7jt0ny44w.jpg
有什么影响吗?这个MCU是1T的单片机,但是我没有开,用的是默认的12T的。
/* SPI主机程序,无中断串口接收并用SPI发送---------------------------------------
--------------------------------------------------------------------*/
#include <STC12C5A60S2.h>
#define SPIF ( SPSTAT & 0x80 ) //查询SPIF是否置位,SPIF不能进行位操作
/*通信端口设置-------------------------------------------------------*/
sbit SCLK = P1^7;
sbit MISO = P1^6;
sbit MOSI = P1^5;
sbit SS = P1^4;
unsigned char UART_SendData=0;
unsigned char UART_RecData=0;
unsigned char SPI_RecData=0;
void Init_System();
void Init_UART();
void Init_SPI();
unsigned char SPI_SendByte(unsigned char SPI_SendData);
void UART_SendByte(unsigned char UART_Send);
void main()
{
Init_System();
while(1)
{
/* 查询UART接收信号 ----------------------------------*/
while(!RI); //查看串口是否接收到数据
{
RI=0; //当接收到数据后,清除接收中断标志
UART_RecData=SBUF; //读入数据
UART_SendData=SPI_SendByte(UART_RecData);//将收到的数据由SPI发送出去,又接收回来
UART_SendByte(UART_SendData);
}
}
}
/*---------------------------------------------------------
*函数名:Init_System
*函数功能:系统初始化
*输入参数:无
*返回参数:无
----------------------------------------------------------*/
void Init_System()
{
Init_UART();
Init_SPI();
}
/*---------------------------------------------------------
*函数名:Init_UART
*函数功能:串口初始化,无中断方式
*输入参数:无
*返回参数:无
----------------------------------------------------------*/
void Init_UART()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xF3; //波特率为2400,晶振为12MHz
TL1=0xF3;
TR1=1; //启动T1
REN=1; //串行允许位
// PCON=0x80; //PCON寄存器的SMOD位置一,波特率提高一倍
SM0=0;
SM1=1; //串行方式1
// ES=1; //中断接收则开串口中断,查询接收则关闭此句
}
/*---------------------------------------------------------
*函数名:Init_SPI
*函数功能:SPI初始化,SPI的工作方式,不使用SPI中断方式
*输入参数:无
*返回参数:无
----------------------------------------------------------*/
void Init_SPI()
{
SPCTL = 0xfc;//CPU_CLK/16,时钟前沿为下降沿,后沿采样,主模式,最低位在前,SPI使能 1111 1101
SPSTAT = 0xc0;//SPDAT.7和SPDAT.6写11,可以将中断标志清零。注意是写1才清零
}
/*---------------------------------------------------------
*函数名:SPI_SendByte
*函数功能:SPI发射接收一体程序
*输入参数:SPI_SendData,经主机发给从机的数据
*返回参数:从机发给主机的数据
----------------------------------------------------------*/
unsigned char SPI_SendByte(unsigned char SPI_SendData)
{
SPDAT= SPI_SendData; //将串口接收的数据装入SPI数据寄存器
UART_SendByte(SPDAT);
while(!SPIF);//等待发送完毕
SPSTAT = 0xc0; //清除中断标志,和写冲突标志,注意是对应位写1才能清零
SPI_RecData = SPDAT;
UART_SendByte(SPDAT);
return SPI_RecData;
}
/*---------------------------------------------------------
*函数名:UART_SendByte
*函数功能:串口发送
*输入参数:UART_Send
*返回参数:无
----------------------------------------------------------*/
void UART_SendByte(unsigned char UART_Send)
{
ti = 0; //清除发送SBUF空标志
SBUF = UART_Send; //写入SBUF
while (!TI); //等待发送完毕
TI = 0; //清除发送SBUF空标志
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>