|
STC15F2K6S2与stc15w404AS的spi通讯
[复制链接]
我用STC15F2K6S2做完主机与从机stc15w404AS通过SPI通讯,但是从机返还的数据显示都是空白!求各位大侠指导一下!主机:收到的数据在LCD中显示
/*********************************头文件***********************************/
#include
#include
/*********************************位定义***********************************/
#define uchar unsigned char
#define lcd1602_db P2
#define SPIF (SPSTAT&0X80)
/*********************************端口定义***********************************/
sbit SPI_SCL=P1^5;
sbit SPI_MISO=P1^4;
sbit SPI_MOSI=P1^3;
sbit SPI_SS=P1^2;
sbit rs=P4^3;
sbit rw=P4^5;
sbit ep=P4^4;
/********************************显示数据表*********************************/
const char j=10;
uchar sendData[15]={"abcdefghijklm"};
uchar recData[]={"abcdefghijklm"};
/*****************************************************************************
函数功能:LCD延时子程序
入口参数:ms
出口参数:
*****************************************************************************/
void delay(unsigned char ms)
{
unsigned int i;
while(ms--)
{
for(i = 0; i< 50; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*****************************************************************************
函数功能:测试LCD忙碌状态
入口参数:
出口参数:result
*****************************************************************************/
bit lcd_bz()
{
unsigned char i;
bit result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
delay(50);
for(i = 0; i< j; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
result = (bit)(P2 & 0x80);
ep = 0;
return result;
}
/*****************************************************************************
函数功能:写指令数据到LCD子程序
入口参数:cmd
出口参数:
*****************************************************************************/
void lcd_wcmd(unsigned char cmd)
{
unsigned char i;
while(lcd_bz()); //判断LCD是否忙碌
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
lcd1602_db = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
for(i = 0; i< j; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
for(i = 0; i< j; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
ep = 0;
}
/*****************************************************************************
函数功能:设定显示位置子程序
入口参数:pos
出口参数:
*****************************************************************************/
void lcd_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80);
}
/*****************************************************************************
函数功能:写入显示数据到LCD子程序
入口参数:dat
出口参数:
*****************************************************************************/
void lcd_wdat(unsigned char dat)
{
unsigned char i;
while(lcd_bz());//判断LCD是否忙碌
rs = 1;
rw = 0;
ep = 0;
lcd1602_db = dat;
_nop_();
_nop_();
_nop_();
_nop_();
for(i = 0; i< j; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
for(i = 0; i< j; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
ep = 0;
}
/*****************************************************************************
函数功能:LCD初始化子程序
入口参数:
出口参数:
*****************************************************************************/
void lcd_init()
{
lcd_wcmd(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay(1);
lcd_wcmd(0x0c); //显示模式设置
delay(1);
lcd_wcmd(0x06); //显示模式设置:光标右移,字符不移
delay(1);
lcd_wcmd(0x01); //清屏幕指令,将以前的显示内容清除
delay(1);
}
/*****************************************************************************
函数功能:SPI初始化子程序
入口参数:
出口参数:
*****************************************************************************/
void init_spi()
{
SPDAT=0; //清空SPI数据寄存器
SPSTAT=0xc0; //清除SPI状态标志位
SPCTL=0xDd; //CPU_CLK/16,时钟前沿位下降沿,后沿采样,主模式,最低位在前
}
/*****************************************************************************
函数名:send
函数功能:SPI发射接收一体程序
输入参数:SendData,经主机发给从机的数据
返回参数:从机发给主机的数据 recdata
*****************************************************************************/
void send()
{
uchar i;
for(i=0;i<16;i++)
{
SPDAT=sendData[i]; //将数据放入SPI数据寄存器
while(!(SPIF)); //等待发送完成
SPSTAT=0xc0; //清除中断标志位
recData[i]=SPDAT; //从机数据采集
}
}
void main()
{
uchar i;
lcd_init();
init_spi();
while(1)
{
send();
lcd_pos(0x00);
for(i=0;i<16;i++)
{
lcd_wdat(recData[i]);
}
delay(1);
}
}
从机
/*************头文件************************/
#include
/*************位定义************************/
#define uchar unsigned char
sbit SPI_SCL=P1^5;
sbit SPI_MISO=P1^4;
sbit SPI_MOSI=P1^3;
sbit SPI_SS=P1^2;
unsigned char SPI_Buffer=0;
#define SPIF (SPSTAT&0X80)
/*---------------------------------------------------------
*函数名:init_spi
*函数功能:SPI初始化
*输入参数: 无
*返回参数: 无
----------------------------------------------------------*/
void init_spi()
{
SPDAT=0; //清空SPI数据寄存器
SPSTAT=0xc0; //清除中断标志位
SPCTL=0xcd; //1100,1101 CPI_CLK/16,时钟前沿下降,后沿采样,从模式,最低位在前
}
/*---------------------------------------------------------
*函数名:main
*函数功能:主函数
*输入参数:
*返回参数:
----------------------------------------------------------*/
void main()
{
init_spi();
SPSTAT=0x34;
while(1)
{
while(!SPIF); //查询传输完成位
SPSTAT=0xc0; //清除中断标志,和写冲突标志,注意是对应位写1才能清零
SPI_Buffer = SPDAT;
SPDAT=0x01; //从机收到SPI数据后,发送固定数据0x33
}
}
|
|