📄 main.c
字号:
#include "config.h"
#include "wireless.h"
#define SIZE 32
#define CSN (1<<29)//P0.29
#define DR (1<<25) //inputP0.25
#define CE (1<<24)// P0.24
#define PWR (1<<23) // P0.23
#define EN (1<<7) //P0.7
#define MSTR (1<<5)
#define CPOL (1<<4)
#define CPHA (1<<3)
#define LSBF (1<<6)
uint8 TxBuf[SIZE],RxBuf[SIZE];
void DELAY_us(int us)
{
unsigned int i,j;
for(j=0;j<us;j++)
{
for(i=0;i<6;i++)
{
}
}
}
void DELAY_ms(int ms)
{
unsigned int j;
for(j=0;j<ms;j++)
{
DELAY_us(1000);
}
}
void MspiInit()
{
S1PCCR=0x52;//256;
S1PCR = 0x20;//MSTR|CPHA ;//|CPHA;//MASTER CPHA=1;CPOL=0
}
uint8 MSendData(uint8 data)
{
S0PSR&=~0x80;
S1PDR = data;
while(0==(S1PSR&0x80));
return (S1PDR);
}
////////////////////////////////////////////////////////////////////////////////END SPI BY GRISHWORLD
void SetGpio0(uint32 GpioP0)
{
IO0SET=IO0SET|GpioP0;
}
void ClrGpio0(uint32 GpioP0)
{
IO0CLR=IO0CLR|GpioP0;
}
uint8 ReadGpio0(uint32 GpioP0)
{
uint32 TempGpio0;
TempGpio0=IO1PIN&GpioP0;
if(TempGpio0==0)
{
return 0;
}
else
return 1;
}
void RFStandBy(void)//待机
{
IO0SET=IO0SET|PWR;//PWR=1;
IO0CLR=IO0CLR|CE;//CE=0;
IO0CLR=IO0CLR|EN;//EN=0;
}
void RFRXModel(void)// rx
{
IO0SET=IO0SET|PWR;//PWR=1;
IO0SET=IO0SET|CE; //CE=1;
IO0CLR=IO0CLR|EN; //EN=0;
}
void RFTXModel(void)// tx
{
IO0SET=IO0SET|PWR;// PWR=1;
IO0SET=IO0SET|CE; //CE=1;
IO0SET=IO0SET|EN;// EN=1;
}
void SPI_CS_ON(void)
{
IO0CLR=IO0CLR|CSN;//CSN = 0;
}
void SPI_CS_OFF(void)
{
IO0SET=IO0SET|CSN; //CSN = 1;
}
void nrf905_ioinit(void)
{
PINSEL1=0x000002A8; //set GPIO&MSPI1
IO0DIR=IO0DIR|CSN|CE|PWR|EN;
IO0DIR=IO0DIR&(~DR);
}
void RF905_Config(void)
{
SPI_CS_ON();
MSendData(WC); // Write config command
MSendData(CH_NO_BYTE); //中心频率低8位 //0x4c
MSendData(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0 //0x0c
MSendData(TX_AFW_4BYTE | RX_AFW_4BYTE); //接收地址宽度4字节,发送地址宽度4字节 //0x44
MSendData(RX_PW_32BYTE); //接收数据宽度32字节 //0x20
MSendData(TX_PW_32BYTE); //发送数据宽度32字节 //0x20
MSendData(RX_ADDRESS_0); //接收有效地址第1字节 //0x12
MSendData(RX_ADDRESS_1); //接收有效地址第2字节 //0x34
MSendData(RX_ADDRESS_2); //接收有效地址第3字节 //0x56
MSendData(RX_ADDRESS_3); //接收有效地址第4字节 //0x78
MSendData(CRC16_EN | XOF_16MHz); //CRC16模式使能,晶体振荡器频率16MHz //0xD8
SPI_CS_OFF();
}
void nrf905_Init(void)
{
RFStandBy();
DELAY_ms(30);//!!!must >3ms
RF905_Config();
RFRXModel();
}
//等待发送结束
void nrf905_WaitSended()
{
while (ReadGpio0(DR)==0);//;//在发送结束时 DR=1;
}
void nrf905_SetTxAddr(void)
{
SPI_CS_ON();
MSendData(WTA); //写Tx地址
MSendData(TX_ADDRESS_0);
MSendData(TX_ADDRESS_1);
MSendData(TX_ADDRESS_2);
MSendData(TX_ADDRESS_3);
SPI_CS_OFF();
}
void nrf905_SetData()
{unsigned char i;
SPI_CS_ON();
MSendData(WTP); //写TxPayload
for (i=0;i<SIZE;i++)
{
MSendData(TxBuf[i]);
}
SPI_CS_OFF();
}
//发送TxBuf中的数据
void nrf905_SendData()
{
//切换到发送模式
RFStandBy();
nrf905_SetTxAddr();//写发送地址
nrf905_SetData();//写数据
RFTXModel();
nrf905_WaitSended();//等待发送结束
}
void nrf905_ReadData()
{
unsigned char i;
SPI_CS_ON();
MSendData(RRP); //读RxPayload
for (i=0;i<SIZE;i++)
{
RxBuf[i]=MSendData(0XFF);//read...
}
SPI_CS_OFF();
}
void RfRecvProc()
{
unsigned char i;
if (ReadGpio0(DR)==1) //DR=1时表示数据接收对而且Crc正确
{
//已经接收到数据
RFStandBy();
nrf905_ReadData();//读出...
for (i=0;i<32;i++)
{ if (RxBuf[i]!=(i+i))
return;
}
}
//从机回送数据包,这样双方都能指示是否收到有效数据包
}
void nrf905_SpiTest()
{
unsigned char i;
SPI_CS_ON();
MSendData(RC); //读配置
for (i=0;i<10;i++)
{
RxBuf[i]= MSendData(0XFF);//read from nrf905
}
SPI_CS_OFF();
}
int main()
{
nrf905_ioinit();
MspiInit();
DELAY_ms(1);
nrf905_Init();
RFRXModel();
for(;;)
{
DELAY_ms(10);
//nrf905_SpiTest();
RfRecvProc();
DELAY_ms(1);
//LED();
if(RxBuf[0]!=0)
{
RFRXModel();
DELAY_ms(1);
}
}
return 0;
}
//测试直接重新发送上次写入的数据
void nrf905_SendAgain()
{
nrf905_SendData();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -