📄 spi_slave.c
字号:
/////SPI调试程序//////////
/////SPI_slave.c//////////////
#include <C8051F040.h>
typedef unsigned char uchar;
typedef unsigned int uint;
xdata uchar aa[6]={0x31,0x32,0x33,0x34,0x35,0x36};
xdata uchar rr[6];
xdata uchar k;
xdata uchar t;
enum {aalen=6};
void delay1ms(uint time){//延迟1ms
uint i;
uint j;
for (i=0;i<time;i++){
for(j=0;j<300;j++);
}
}
void spi_cfg(uchar spicfg,uchar spickr,uchar spicn){//SPI配置函数
SFRPAGE = 0x00;
SPI0CFG = spicfg;
SPI0CKR = spickr;
SPI0CN = spicn;
SFRPAGE = 0x0F;
EIE1|= 0x01;
}
void config (void) {
WDTCN = 0x07; //看门狗禁止
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
XBR0 = 0x02;
XBR1 = 0x00;
XBR2 = 0x40;
XBR3 = 0x00;
P0MDOUT = 0x0c;
/*交叉开关配置,SPI总线SCK配置到P0.0口,为开漏输出;MISO为P0.1口,开漏输出;MOSI为P0.2口,推挽输出,NSS为P0.3口*/
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
//采用内部晶振,为24.5MHZ8分频
} //End of config
void main(){
config();
spi_cfg(0x10,0x2d,0x05);
/*
SPI0CFG = 0x10; // SCK高电平空闲,从机模式,其他设置与主机相同
SPI0CKR = 0x2D; // 从机的SCK时钟对SPI总线无影响
SPI0CN = 0x05; // 4线制从机模式,SPIEN为1
*/
EA=1;
k=0;
while(1){
SFRPAGE=0x00;
if(SPIEN==0)
k=0;//可在此设断点观察接收数组与主机发送数组是否一致
}
}
void spi_ISR() interrupt 6{
SFRPAGE=0x00;//此代码可省略,SFRPAGE能自动跳转到中断标志位所在页
rr[k]=SPI0DAT;
//程序中尚未考虑接收溢出等情况,对于双机通讯暂无影响
SPI0DAT=aa[k];
//全双工通讯,所以接收的同时,可将发送的数据写入发送缓冲区
//在下一次接收过程中将发送缓冲区的数据发送出去。
k++;
if(k>=6)
SPIEN=0;//接收7个数据
SPIF=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -