8619|2

4

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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       
        }
}

此帖出自单片机论坛

最新回复

太多了,看不完,感觉不会有太多错误的。  详情 回复 发表于 2014-7-17 02:06
点赞 关注
 

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
太多了,看不完,感觉不会有太多错误的。
此帖出自单片机论坛
 
个人签名51嵌入式,嵌入式开发的家园!
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
那我弄短,它再发过条看看
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表