两个STC8H通过SPI传输数据
要实现的功能: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);
}
}
SPI每隔200ms发一个字节,要用示波器的标准(普通)触发,扫描速度1us/DIV,才能看到。 问题找到了,SS改为非专用脚MOSI就可以测到数据波形了。
SS如果用P2.2,P2.2设置为推挽输出,也不行;因外部未留上拉电阻,开漏输出没试。
例程用的
sbit SS = P1^0;
避开了所有专用SS脚。
不确定这是否算个坑{:4_167:}
互为主从系统是,主机和从机的程序时一样的吗? 互为主从系统时,两块板的程序、LED,KEY,SS接的IO也都一样吗?主机模式和从机模式怎么区分?按哪个板的按键哪个板是主机? 按键一次发一次0x5a,在MOSI上可测到信号,MISO上无信号
页:
[1]