找回密码
 立即注册
查看: 717|回复: 5

两个STC8H通过SPI传输数据

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-02-09 10:04:07

2

主题

8

回帖

50

积分

注册会员

积分
50
发表于 2023-6-1 18:24:07 | 显示全部楼层 |阅读模式
要实现的功能:

SPI主机将存在数组里的位图数据连续发给从机,
SPI从机将接收的数据存储或直接给LCD显示。


先修改,运行范例程序,不管主机是否没连接从机,用示波器测MOSI上都没测到数据信号?

下面时完成程序,大佬帮忙看一下,谢谢!


#include "reg51.h"
#include "intrins.h"

sfr     P0M1    =   0x93;
sfr     P0M0    =   0x94;
sfr     P1M1    =   0x91;
sfr     P1M0    =   0x92;
sfr     P2M1    =   0x95;
sfr     P2M0    =   0x96;
sfr     P3M1    =   0xb1;
sfr     P3M0    =   0xb2;
sfr     P4M1    =   0xb3;
sfr     P4M0    =   0xb4;
sfr     P5M1    =   0xc9;
sfr     P5M0    =   0xca;

sfr        P_SW1   =   0xa2;
sfr     SPSTAT  =   0xcd;
sfr     SPCTL   =   0xce;
sfr     SPDAT   =   0xcf;
sfr     IE2     =   0xaf;
#define ESPI        0x02

sbit    SS      =   P2^2;
sbit    LED     =   P1^7;

//delay ms
void delay_ms(unsigned char COUNT)                //@6.000MHz
{
        unsigned char i, j;

        while(COUNT--)
        {
                        _nop_();
                        i = 8;
                        j = 200;
                        do
                        {
                                while (--j);
                        } while (--i);
        }
}

/**************************************/
void main()
{
    P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;

    LED = 0;
          delay_ms(200);
   
        //SPI初始化
          SS = 1;
  
//  P_SW1 = 0x00;                               //SS/P1.2, MOSI/P1.3, MISO/P1.4, SCLK/P1.5
    P_SW1 = 0x04;                               //SS_2/P2.2, MOSI_2/P2.3, MISO_2/P2.4, SCLK_2/P2.5
//  P_SW1 = 0x08;                               //SS_3/P5.4, MOSI_3/P4.0, MISO_3/P4.1, SCLK_3/P4.3
//  P_SW1 = 0x0c;                               //SS_4/P3.5, MOSI_4/P3.4, MISO_4/P3.3, SCLK_4/P3.2
       
    SPCTL = 0x50;                               //使能SPI主机模式
    SPSTAT = 0xc0;                              //清中断标志

    while (1)
    {
        SS = 0;                                     //拉低从机SS
        SPDAT = 0x5a;                           //发送测试数据
        while (!(SPSTAT & 0x80));            //查询完成标志
        SPSTAT = 0xc0;                          //清中断
        SS = 1;                                    //拉高从机SS
        
                          LED = 1;                //测试
                         delay_ms(200);                     
               
                          LED = 0;
                          delay_ms(200);
    }
}



回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2023-6-1 21:52:18 | 显示全部楼层
SPI每隔200ms发一个字节,要用示波器的标准(普通)触发,扫描速度1us/DIV,才能看到。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-02-09 10:04:07

2

主题

8

回帖

50

积分

注册会员

积分
50
发表于 2023-6-2 12:57:51 | 显示全部楼层
问题找到了,SS改为非专用脚MOSI就可以测到数据波形了。
SS如果用P2.2,P2.2设置为推挽输出,也不行;因外部未留上拉电阻,开漏输出没试。

例程用的
sbit    SS      =   P1^0;
避开了所有专用SS脚。

不确定这是否算个坑
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15630
发表于 2023-6-2 13:41:58 | 显示全部楼层
1.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-02-09 10:04:07

2

主题

8

回帖

50

积分

注册会员

积分
50
发表于 2023-6-2 15:33:54 | 显示全部楼层
互为主从系统是,主机和从机的程序时一样的吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-02-09 10:04:07

2

主题

8

回帖

50

积分

注册会员

积分
50
发表于 2023-6-2 16:57:03 | 显示全部楼层
互为主从系统时,两块板的程序、LED,KEY,SS接的IO也都一样吗?主机模式和从机模式怎么区分?按哪个板的按键哪个板是主机? 按键一次发一次0x5a,在MOSI上可测到信号,MISO上无信号
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 00:50 , Processed in 0.114548 second(s), 78 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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