⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.c

📁 spi模拟
💻 C
字号:
#include"spce061v004.h"
#include"spi.h"
#include"hh.h"

#define 	TX_EN  		 0x01					//iob0 1
#define  	TRX_CE       0x02             		//iob1 1
#define 	POW_UP 		 0x04					//iob2 1
#define  	CD  		 0x08					//iob3 0
#define  	AM  		 0x10					//iob4 0
#define  	DR  		 0x20					//iob5 0
#define   MISO		     0x40                   //iob6 0
//#define   MOSI           0x80					//1ob7 1
#define   MOSI           0x01					//1oA0 1
#define   SCK            0x0100    				//iob8 1
#define   CSN            0x0200					//iob9 1

#define   CD1            pb_data_03
#define   AM1            pb_data_04
#define   DR1            pb_data_05

#define   CS0            *P_IOB_Data&=0xfdff       //CSN=0
#define   CS1            *P_IOB_Data|=0x0200       //CSN=1 
#define   SCK0           *P_IOB_Data&=0xfeff
#define   SCK1           *P_IOB_Data|=0x0100   
//#define   MOSI1	         *P_IOB_Data|=0x0080
//#define   MOSI0			 *P_IOB_Data&=0xff7f
#define   MOSI1	         *P_IOA_Data|=0x01
#define   MOSI0			 *P_IOA_Data&=0xfffe
#define   TX_EN_Clr      *P_IOB_Data&=0xfffe
#define   TX_EN_Set      *P_IOB_Data|=0x0001  
#define   TRX_CE_Clr     *P_IOB_Data&=0xfffd
#define   TRX_CE_Set     *P_IOB_Data|=0x0002 
#define   POW_UP_Clr     *P_IOB_Data&=fffb
#define   POW_UP_Set     *P_IOB_Data|=0x0004	
#define     TxLen     10          //射频发送绶冲区长度
#define     RxLen     10          //射频接收绶冲区长度

unsigned char RxBuf[RxLen]={8,8,8,8,8};                 //射频接收缓冲区
unsigned char TxBuf[TxLen];                 //射频接收缓冲区	

unsigned char Send_Test[3]={1,3,2};
unsigned char Rece_Data[3]={0};
unsigned char Test[10]={9,9,9,9,9,9,9,9,9,9};
unsigned char RFconf[10]=
{
0x6C, //CH_NO,配置频段在433.2MHZ
0x0C, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x20,0x20, //接收发送有效数据长度为3字节
0x30,0x30,0x30,0x30, //表决器地址
0xDF, //CRC充许,16位CRC校验,外部时钟信号使能,16M晶振
};

void Delay_Us(unsigned int TimeCnt)
{
    int i;
    *P_SystemClock = 0x98;
    for(i = 0; i < TimeCnt; i++)
    {
        *P_Watchdog_Clear = 0x0001;
    }
}
//*****************************************************模拟SPI
void SPI_SendByte(unsigned char data)//MOSI
{unsigned char i;
  data=data<<8;	//16bit
  SCK0;  
  for(i=0;i<8;i++)
   {
    *P_Watchdog_Clear = 0x0001;
    if(data&0x8000)
      MOSI1;
    else  MOSI0;
     Delay_Us(10);
     SCK1;
     data<<=1;   
   	 Delay_Us(10);
   	  SCK0; 
    Delay_Us(10);
     } 
}

unsigned char SPI_ReceiveByte()               //MISO
{
 unsigned char Temp=0,i;
  SCK0;
 for(i=0;i<8;i++)//16bit
 {
 // SCK0;
 // Delay_Us(10);
  *P_Watchdog_Clear = 0x0001;
  Temp=Temp<<1;
  SCK1;
  Delay_Us(10);
   if(*P_IOB_Data&0x40)Temp++;//miso
   SCK0;
  Delay_Us(10); 
  }
  return Temp;
}

//*******************************************************************************NRF905
void TX_Packey(unsigned char *p,unsigned char Num)
{
 unsigned char i;
  CS0;  //CE_905 = 0;
  SPI_SendByte(WTA);
  SPI_SendByte(0xE7);
  SPI_SendByte(0xE7);
  SPI_SendByte(0xE7);
  SPI_SendByte(0xE7);
  CS1;  //CE_905 = 1;
  
 CS0;
 SPI_SendByte(WTP);//写发送有效数据
 //CS1;
 for(i=0;i<Num;i++)
  {
   SPI_SendByte(p[i]);
  // Delay_Us(10);
  }
 CS1;
 Delay_Us(50);
 TX_EN_Set;//发射模式
 TRX_CE_Set;//开始发射
 while(!DR1)
  {
  *P_Watchdog_Clear=0x01;
  }
 TRX_CE_Clr;
 TX_EN_Clr;
// RX_On();
}
//*************************************************receive
void  RE_Packey(unsigned char *p,unsigned char Num)
{
 unsigned char i;
 TX_EN_Clr;//接收模式     //?????????????
 //*P_IOB_Data&=0xfffe;
 TRX_CE_Set;
 while(!CD1)*P_Watchdog_Clear=0x01;
 while(!AM1)*P_Watchdog_Clear=0x01;
 while(!DR1)*P_Watchdog_Clear=0x01;
 TRX_CE_Clr;
 //Delay_Us(30);
 CS0;
 SPI_SendByte(RRP);//读接受有效数据
for(i=0;i<Num;i++)
 {
  p[i] =SPI_ReceiveByte();     //接收数据
 } 
 CS1;
}
//************************************************test
void SPI_ReadTest()
{
 unsigned char i;
 CS0;
 SPI_SendByte(RRC);
  for(i=0;i<10;i++)
  {
   Test[i]=SPI_ReceiveByte();
   Delay_Us(60);
 
  }
 CS1;
}
void RX_On(void)
{
 POW_UP_Set;
 TRX_CE_Set;
 TX_EN_Set;
}
//****************************************************
void NRF905_Init()
{
 unsigned int i,temp=0;
 POW_UP_Set;//iob2
 Delay_Us(50);
 TRX_CE_Clr;
 TX_EN_Clr; 
  CS0;
 //temp=SPI_ReceiveByte();
 //SPI_ReadTest();

 SPI_SendByte(WRC);
 for(i=0;i<10;i++)
 {
  SPI_SendByte(RFconf[i]);
 }
 CS1;
  //写主控设备地址
 Delay_Us(20);
 SPI_ReadTest();
 
}
void SPI_IO_Init(void)
{   *P_IOB_Dir=0x0307;
    *P_IOB_Attrib=0x0307;
    //*P_IOB_Dir |= (TX_EN+TRX_CE+POW_UP+CSN+SCK+MOSI);//设定为1,单片机输出,PTR输入 0x0387 0000 0011 1000 0111b
    //*P_IOB_Attrib |= (TX_EN+TRX_CE+POW_UP+CSN+SCK+MOSI)+(CD+AM+DR+MISO);//设定为1 0x3fff 0011 1111 1111 1111b
    //*P_IOB_Dir &=~(CD+AM+DR+MISO);//设定为0,单片机输入,PTR输出
    *P_IOB_Data=0xffff;
    *P_IOB_Data=0x0;
    //*P_IOB_Data&=~(TX_EN+TRX_CE+POW_UP+CSN+SCK+MOSI);        //设定为0,初始化IO端口
  //  *P_IOB_Data|=0x80;
   //   *P_IOB_Dir=0x0307;
      
     *P_IOA_Dir =0xffff;
     *P_IOA_Attrib=0xffff;
     *P_IOA_Data=0xffff;
     *P_IOA_Data=0x0;
 
}   
 
int main()
{
 //unsigned char flag=2;
 SPI_IO_Init();
 NRF905_Init();
 SPI_ReadTest();
 
 while(1)
 {*P_Watchdog_Clear=0x01;
  RE_Packey(Rece_Data,3);
 }
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -