📄 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 + -