基本信息
源码名称:W5500通信软件包 源码
源码大小:0.10M
文件格式:.rar
开发语言:C/C++
更新时间:2018-07-16
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 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;
}