基本信息
源码名称:W5500通信软件包 源码
源码大小:0.10M
文件格式:.rar
开发语言:C/C++
更新时间:2018-07-16
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
/******************************************************************************************** * 文 件 名:SSP_SPI_Slave.c * 功 能:本实验将SSP配置为SPI从机,将SPI0配置为SPI主机。SSP接收SPI0发送的数据,并进行比较, * 若接收正确,则LED1闪烁,LED2熄灭;否则LED2一直点亮。SSP采用中断方式接收数据。 * 说 明:用跳线帽短接74HC595_2的相关跳线。 * 用杜绑线连接P0.17(SCK1)和P0.4(SCK0),P0.18(MISO1)和P0.5(MISO0),P0.19(MOSI1) * 和P0.6(MOSI0),P0.29和P0.20(SSEL1)。 * 调试方法:全速运行程序,如果接收正确,可以看到LED1在闪烁;若拔开P0.19(MOSI1)和P0.6(MOSI0)的 * 连线,LED1停止闪烁,LED2将会点亮。直到重新插上后,LED1恢复闪烁,而LED2熄灭。 * 作 者:POWER * 日 期:2006年7月30号 * 斯凯科技主页:www.armsky.net * 斯凯科技论坛:www.armsky.net/bbs *********************************************************************************************/ #include "config.h" #define SLAVE_CS ((uint32)1<<29) // P0.29口为SPI从机的选择控制引脚 #define H_SLAVE_CS() IO0SET=SLAVE_CS // 作为SPI从机选择控制引脚的P0.29置高 #define L_SLAVE_CS() IO0CLR=SLAVE_CS // 作为SPI从机选择控制引脚的P0.29置低 #define SPI_CS ((uint32)0x01<<20) // P1.20引脚模拟SPI的片选信号 #define SPI_DATA ((uint32)0x01<<22) // P0.22引脚模拟SPI的数据信号 #define SPI_CLK ((uint32)0x01<<25) // P1.25引脚模拟SPI的时钟信号 #define H_SPI_CS() IO1SET=SPI_CS // SPI的片选信号置高 #define L_SPI_CS() IO1CLR=SPI_CS // SPI的片选信号置低 #define H_SPI_DATA() IO0SET=SPI_DATA // SPI的数据信号置高 #define L_SPI_DATA() IO0CLR=SPI_DATA // SPI的数据信号置低 #define H_SPI_CLK() IO1SET=SPI_CLK // SPI的时钟信号置高 #define L_SPI_CLK() IO1CLR=SPI_CLK // SPI的时钟信号置低 volatile uint8 RcvData; // 接收到的数据 volatile uint8 RcvFlag; // 接收到新数据标志 /******************************************************************************************** * 函数名称:SSP_IRQ() * 功 能:SSP中断服务函数 * 入口参数:无 * 出口参数:无 *********************************************************************************************/ void __irq SSP_IRQ(void) { RcvData=SSPDR; // 接收数据 RcvFlag=0x01; // 接收到新数据 SSPICR=0x03; // 清除标志位 VICVectAddr=0x00; // 中断向量处理结束 } /******************************************************************************************** * 函数名称:Delay() * 功 能:软件延时 * 入口参数:count 延时参数,值越大,延时越长 * 出口参数:无 *********************************************************************************************/ void Delay(uint32 count) { uint32 i; for(;count>0;count--) for(i=0;i<50000;i ); } /******************************************************************************************** * 函数名称:SendDataTo74HC595() * 功 能:向74HC595发送一字节数据 * 入口参数:data 要发送的数据 * 出口参数:无 * 注 意:发送数据时,高位先发送 *********************************************************************************************/ void SendDataTo74HC595(uint8 data) { uint8 i; L_SPI_CS(); // SPI_CS=0 for(i=0;i<8;i ) // 发送8位数据(1个字节) { L_SPI_CLK(); // SPI_CLK=0 /* 设置SPI_DATA输出值 */ if((data & 0x80)!=0) H_SPI_DATA(); // SPI_DATA=1 else L_SPI_DATA(); // SPI_DATA=0 data<<=1; // 将要发送的1字节数据左移一位 H_SPI_CLK(); // SPI_CLK=1 } H_SPI_CS(); // SPI_CS=1 } /******************************************************************************************** * 函数名称:SPI_Init() * 功 能:初始化SPI接口,设置为主机 * 入口参数:无 * 出口参数:无 *********************************************************************************************/ void SPI_Init(void) { SPI_SPCCR=0x52; // 设置SPI时钟分频 SPI_SPCR=0x30; // 设置SPI接口模式,MSTR=1,CPOL=1, // CPHA=0,LSBF=0 } /******************************************************************************************** * 函数名称:SSP_Init() * 功 能:将SSP控制器初始化为SPI接口,设置为从机 * 入口参数:无 * 出口参数:无 *********************************************************************************************/ void SSP_Init(void) { SSPCR0=(0x05<<8)| // SCR 设置SPI时钟分频 (0x00<<7)| // CPHA 时钟输出相位:仅SPI模式有效 (0x01<<6)| // CPOL 时钟输出极性:仅SPI模式有效 (0x00<<4)| // FRF 帧格式:00=SPI,01=SSI,10=Microwire,11=保留 (0x07<<0); // DSS 数据长度:0000~0010=保留,0011=4位, // 0111=8位,1111=16位 SSPCR1=(0x00<<3)| // SOD 从机输出禁止:1=禁止;0=允许 (0x01<<2)| // MS 主从选择:0=主机;1=从机 (0x01<<1)| // SSE SSP使能:1=允许SSP与其他设备通信 (0x00<<0); // LBM 回写模式 SSPCPSR=0x52; // pclk分频值 SSPIMSC=0x02; // 中断屏蔽寄存器 SSPICR=0x03; // 中断清零寄存器清零 } /******************************************************************************************** * 函数名称:MSPI_SendData() * 功 能:SPI0接口向SPI总线发送数据 * 入口参数:data 待发送的数据 * 出口参数:返回值为读取的数据 *********************************************************************************************/ uint8 MSPI_SendData(uint8 data) { L_SLAVE_CS(); // 选择SSP为从机 SPI_SPDR=data; while(0==(SPI_SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕 H_SLAVE_CS(); return(SPI_SPDR); } /******************************************************************************************** * 函数名称:main() * 功 能:SPI从机演示实验 *********************************************************************************************/ int main(void) { uint8 rcv_data; PINSEL0=0x00000000; // 设置SPI0引脚连接 PINSEL1=0x000002a8; // 设置SSP引脚连接 IO1DIR=0; // 防止数码管干扰 // PINSEL1&=~((uint32)0x03<<26); // 选择P0.29为GPIO // 设置P0.29为输出 PINSEL1&=~((uint32)0x03<<12); // 设置P0.22引脚为GPIO PINSEL2&=~((uint32)0x01<<3); // 设置P1.20和P1.25引脚为GPIO IO0DIR|=SPI_DATA; // 设置P0.22,P1.20,P1.25引脚为输出 IO1DIR|=(SPI_CS | SPI_CLK); SendDataTo74HC595(0xff); // LED8~LED1全部熄灭 IRQEnable(); // IRQ中断使能 // SPI_Init(); // 初始化SPI接口 SSP_Init(); // 初始化SSP接口 /* SSP中断初始化(使用向量中断)*/ VICIntSelect=0x00000000; // 设置所有中断为IRQ VICVectCntl0=0x20 | 11; // 分配SSP中断为中断向量0,即最高优先级 VICVectAddr0=(uint32)(&SSP_IRQ); // 设置中断服务程序地址 VICIntEnable=1<<11; // 允许SSP中断 while(1) { RcvFlag=0; // 清除接收到新数据标志 // rcv_data=MSPI_SendData(0x5a); // 发送数据0x5a Delay(20); // 延时 if(RcvFlag!=0) // 如果接收到新数据 { if(RcvData==0x84) // 判断接收到的数据是否为0x5a { /* 接收的数据与发送的数据相同,LED1闪烁 */ SendDataTo74HC595(0xff); // 接收正确时,LED2熄灭 SendDataTo74HC595(0xfe); Delay(20); SendDataTo74HC595(0xff); Delay(20); } else /* 数据错误,LED2一直点亮 */ SendDataTo74HC595(0xfd); } } return 0; }