微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助:STC15F2K60S2 调试spi出现的问题

求助:STC15F2K60S2 调试spi出现的问题

时间:10-02 整理:3721RD 点击:
求助各位TX 小弟最近选用stc15做一个小实验,用到AD7705,但始终没调通,感觉spi总线没工作一样,就写了这段小程序,目的是想通过串口调试助手让下位机返回 SPDAT 这个寄存器里的值, 但是收到的确实"00” ,而不是我想象中的 "0X66"喃,还望指点,谢谢!
  //芯片的工作频率为11.0592MHz
#include "STC15F2K60S2.h"
#include "intrins.h"
#define  BYTE unsigned char   
#define  WORD unsigned int
#define S1_S0 0x40              //P_SW P3.0 RXD P3.1 TXD
#define S1_S1 0x80         
#define SPIF        0x80        //SPSTAT.7  传输完成标志                              
#define WCOL        0x40        //SPSTAT.6  写冲突标志
#define SSIG        0x80        //SPCTL.7                                 
#define SPEN        0x40        //SPCTL.6                                 
#define DORD        0x20        //SPCTL.5                                 
#define MSTR        0x10        //SPCTL.4                                 
#define CPOL        0x08        //SPCTL.3                                 
#define CAHA        0x04        //SPCTL.2                                 
#define SPDHH       0x00        //CPU_CLK/4                              
#define SPDH        0x01        //CPU_CLK/16                              
#define SPDL        0x02        //CPU_CLK/64                              
#define SPDLL       0x03        //CPU_CLK/128  
   
void UartInit();      //MCU 串口1初始化
void InitSPI();       //MCU SPI初始化
void delay50us();  //延时函数 50us
///////////////////////////////////////////////////////////
void main()
{
        
delay50us();     //延时等待外围器件稳定
UartInit();                 //初始化串口
InitSPI();                  //初始化SPI   
SPDAT = 0X66;
     while (!RI);     //查询串口标志位
     RI=0;
  SBUF = SPDAT;
   
}   
///////////////////////////////////////////////////////////
//*********SPI初始化********///
void InitSPI()
{
    SPCTL = SPEN|MSTR; //0xdf 使能SPI,MSB先发送,主机,SCK空闲高,128分频
SPDAT = 0X66;                  //初始化SPI数据
    SPSTAT = SPIF | WCOL;       //清除SPI状态位
   
}
  void UartInit()  //9600bps@11.0592MHz
{
ACC = P_SW1;
    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
    P_SW1 = ACC;    //P3.0 RXD P3.1 TXD
PCON &= 0x7F;  //波特率不倍速
SCON = 0x50;  //8位数据,可变波特率
AUXR |= 0x40;  //定时器1时钟为Fosc,即1T
AUXR &= 0xFE;  //串口1选择定时器1为波特率发生器
TMOD &= 0x0F;  //清除定时器1模式位
TMOD |= 0x20;  //设定定时器1为8位自动重装方式
TL1 = 0xDC;      //设定定时初值
TH1 = 0xDC;     //设定定时器重装值
ET1 = 0;    //禁止定时器1中断
TR1 = 1;      //启动定时器1
//ES = 1;             //使能串口中断
    //EA = 1;
}
void delay50us()
{
  BYTE i, j;
_nop_();
i = 1;
j = 134;
do
{
  while (--j);
} while (--i);
}

感觉main程序没执行完~~外面加个for循环也好~另外,RI是接收标志,TI是发送标志。你需要用TI。
给你个例子:
        while(1)
        {                  if(RI)
                {                                //查询是否有数据接收
                        ldat=SBUF;                //数据暂存于变量中
                        RI=0;                        //重新清0等待接收
                        SBUF=ldat;                //将接收到的数据发送出去
                        while(!TI);                //等待发送完成
                        TI=0;
                }
        }

这是个不断收发的程序~~ 你可以用来测试一下 串口传输。 当然之前要配置好 波特率 等~~

我目的是当串口有数据过来时,将spi数据寄存器SPDAT的内容赋给SBUF通过串口发送出去,因为我在用AD7705时,感觉spi没工作,所以弄个小测试程序。

你好我想请问一下,这个芯片的串口怎么用啊?我怎么调试不出来啊

你好我想请问一下,这个芯片的串口怎么用啊?我怎么调试不出来啊

你好我想请问一下,这个芯片的串口怎么用啊?我怎么调试不出来啊

你好我想请问一下,这个芯片的串口怎么用啊?我怎么调试不出来啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top