本例使用擎天柱核心板完成测试。程序代码如下:
#include "Ai8051U.H" #include "intrins.h" #include "stdio.h" #define FOSC 22118400L // 下载程序时,使用该频率烧录 sbit SS = P1^0; sbit LED = P1^1; // 延时 void delay_ms(unsigned int ms) { unsigned int i; do { i = FOSC/6000; while(--i); } while(--ms); } void main() { unsigned char dat = 0; EAXFR = 1; //允许访问扩展的特殊寄存器,XFR //(32 位模式请使用这句,注释下一句) // P_SW2 |= 0x80; //允许访问扩展的特殊寄存器,XFR //(8 位模式请使用这句,注释上一句) WTST = 0; //设置取程序代码等待时间, //赋值为 0 表示不等待,程序以最快速度运行 CKCON = 0; //设置访问片内的 xdata 速度, //赋值为 0 表示用最快速度访问,不增加额外的等待时间 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 = 1; SS = 1; busy = 0; SPCTL = 0x50;//|0x80; //使能 SPI 主机模式 // 设置功能引脚,本例默认使用P2.4(SS)、P2.5(MOSI)、P2.6(MISO)、P2.7(SCK) SPI_S1 = 0; //00: P1.4 P1.5 P1.6 P1.7, 01: P2.4 P2.5 P2.6 P2.7, 10: P4.0 P4.1 P4.2 P4.3, 11: P3.5 P3.4 P3.3 P3.2 SPI_S0 = 1; SPSTAT = 0xc0; //清中断标志 delay_ms(10); LED = 0; while(1) { dat++; SS = 0; //拉低从机 SS 管脚 SPDAT = dat; //发送测试数据 while (!SPIF); //查询完成标志 SPIF = 1; //清中断标志 SS = 1; //拉高从机的 SS 管脚 } }
程序使用轮询方式,通过判断SPIF标志位判断发送是否完成。LED信号是为了在使用逻辑分析仪捕捉SPI发送开始的信号。主要是为了看看在使用SPI外设时,没有明确指明是否默认使用SPI外设的SS信号情况下,看看SS信号是否被输出了。逻辑分析仪测试到的信号如下图:
从测试结果看,SPI外设的SS信号在发送数据的过程中没有变化,也就意味着在有SPI子设备时,需要另外提供SS信号。