找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2086|回复: 2
打印 上一主题 下一主题
收起左侧

STC15W408AS单片机模拟SPI双机通信程序问题

[复制链接]
跳转到指定楼层
楼主
ID:825513 发表于 2021-8-15 02:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写了一个GPIO模拟SPI进行两块MCU之间的双机通信的程序(预期目标: 利用串口中断,首先利用电脑A得串口助手发送的数据存入SBUF,再将SBUF的值通过SPI的SDO发送给从机的SDI接收,并存入从机的SBUF,显示在电脑B的串口助手上;例如:电脑A发送数据,如:A,电脑B可接收到A。),但烧录并连接好电路后,从机无法接收到数据,两块核心板之间的连线已检查无误,连接核心板与PC的USB转串口烧录工具也正常无故障,折腾了一番无果后来这里向大佬们请教

单片机源码如下(主、从机源码相同):

# include <reg52.h>//头文件
# include <intrins.h>//头文件

# define uchar unsigned char
# define uint unsigned int

sbit SCK = P1^0;//位定义时钟
//sbit CS = P1^1;//位定义片选(使能)  此项目可以不使用
sbit SDI = P1^2;//位定义Input
sbit SDO = P1^3;//位定义Output

/*-----函数声明-----*/
void delay5us();
void SpiSend(uchar dat1);
uchar SpiReceive();
void UARTInit();

/*-----主函数-----*/
void main()
{        
        UARTInit();
         while(1)
    {
                SBUF = SpiReceive();// 循环接收数据
    }
        ;//空语句        
}

/*-----5微秒延时函数-----*/
void delay5us()
{
        _nop_();
}

/*-----CPHA=0;CPOL=1 模式2-----*/
/*-----SPI发送函数-----*/
/*-----上升沿发送-----*/
void SpiSend(uchar dat1)
{
        uchar i;
        for (i=0; i<8; ++i)//8bit,一位一位写
        {
                SCK = 0;
                if (dat1 & 0x80)//判断当前最高位为1还是0
                {
                        SDO = 1;               
                }
                else
                {
                        SDO = 0;
                }
                SCK = 1;//上升沿发送数据
                dat1 <<= 1;
                delay5us();               
        }
}

/*-----SPI接收函数-----*/
/*-----下降沿接收-----*/
uchar SpiReceive()
{
        uchar i, dat0;
        dat0 = 0x00;//dat0初始化
        for (i=0; i<8; ++i)//8bit,一位一位读
        {
                dat0 <<= 1;
        while(SCK == 1);   
        while(SCK == 0);//等待下降沿,下降沿读取数据      
        dat0 |= SDI;         
        }
        return (dat0);//收到数据(返回值)dat0
}

/*-----串口(中断)初始化-----*/
void UARTInit()
{
        EA = 1;//开启总中断
        ES = 1;//打开串口中断
        SM0 = 0;SM1 = 1;//串口工作方式1,8位UART波特率可变
        REN = 1;//串口允许接收
        TR1 = 1;//启动定时器1
        TMOD |= 0X20;//定时器1,工作模式2 8位自动重装
        TH1 =0XFD;
        TL1 =0XFD;//设置波特率9600
}

/*-----串口中断服务函数-----*/
void UART() interrupt 4
{
        if (RI)//判断是否接收完成
        {
                RI = 0;//软件清零
        SpiSend(SBUF);         // 转发接收到的数据
        }
        if (TI)//判断是否发送完成
        {
                TI = 0;//软件清零
        }               
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2021-8-15 07:08 | 只看该作者
先让从机不断发看电脑B的串口助手能收到吗,再让主向从发看电脑B的串口助手能收到吗,一步步来找毛病。
回复

使用道具 举报

板凳
ID:825513 发表于 2021-8-15 09:56 | 只看该作者
xuyaqi 发表于 2021-8-15 07:08
先让从机不断发看电脑B的串口助手能收到吗,再让主向从发看电脑B的串口助手能收到吗,一步步来找毛病。

之前已经试过了,都不行
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表