📄 main.c
字号:
#define JUDGE_RF905_CD (IO0PIN & RF905_CD)
#define INRF905_AM IO0DIR = IO0DIR & ~ RF905_AM
#define JUDGE_RF905_AM (IO0PIN & RF905_AM)
void ChangeMode(uint8 num)
{
if(num==PowerDown)
{
RF905_PWRL; /* 配置为掉电模式 */
_delay_loop_(1);
RF905_TX_ENL;
_delay_loop_(1);
RF905_TRX_ENL;
_delay_loop_(1);
}
if(num==Standby)
{
RF905_TRX_ENL;
_delay_loop_(1);
RF905_TX_ENL;
_delay_loop_(1);
RF905_PWRH;
_delay_loop_(1);
}
if(num==RXMode)
{
RF905_TX_ENL;
_delay_loop_(1);
RF905_PWRH;
_delay_loop_(1);
Delayus(2);
RF905_TRX_ENH;
_delay_loop_(1);
}
if(num==TXMode)
{
RF905_TX_ENH;
_delay_loop_(1);
RF905_PWRH;
_delay_loop_(1);
RF905_TRX_ENL;
_delay_loop_(1);
}
if(num==TXData)
{
RF905_TRX_ENH; //Set TRX_CE high,start Tx data transmission
_delay_loop_(1);
Delayus(10);
RF905_TRX_ENL; /* ?? Make a 20us Pulse as nRF905 Datasheet */
_delay_loop_(1);
}
}
void RFSpiWrite(unsigned char Out_data)
{
unsigned char i;
for(i = 0;i<8;i++)
{
if((Out_data << i) & 0x80)
{
RF905_DOUTH;
}
else
{
RF905_DOUTL;
}
RF905_SCLKH;
Delayus(1);
RF905_SCLKL;
}
}
unsigned char RFSpiRead(void)
{
unsigned char i;
unsigned char dd;
dd=0;
for(i=0;i<8;i++)
{
dd<<=1;
RF905_SCLKH;
if(JUDGE_RF905_DIN)
{
dd|=0x00000001;
}
else
{
dd&=0xFFFFFFFE;
}
RF905_SCLKL;
}
return(dd);
}
void Config905(void) //配置nRF905
{
RF905_CSNL; //Spi enable for write a spi command
RFSpiWrite(WC); // Write config command
RFSpiWrite(CH_NO_BYTE); //中心频率低8位
RFSpiWrite(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
RFSpiWrite(TX_AFW_4BYTE | RX_AFW_4BYTE); //接收地址宽度4字节,发送地址宽度4字节
RFSpiWrite(RX_PW_32BYTE); //接收数据宽度16字节
RFSpiWrite(TX_PW_32BYTE); //发送数据宽度16字节
RFSpiWrite(RX_ADDRESSB_0); //接收有效地址第1字节
RFSpiWrite(RX_ADDRESSB_1); //接收有效地址第2字节
RFSpiWrite(RX_ADDRESSB_2); //接收有效地址第3字节
RFSpiWrite(RX_ADDRESSB_3); //接收有效地址第4字节
RFSpiWrite(CRC16_EN | XOF_16MHz); //CRC16模式使能,晶体振荡器频率16MHz
RF905_CSNH; // Disable Spi
}
void RF905_Read(uint8 RFcmd,uint8 *RFdata)
{
uint8 i,len;
if(RFcmd==WTA|RFcmd==RTA) len=4;
else if(RFcmd==WC|RFcmd==RC) len=10;
else if(RFcmd==WTP|RFcmd==RTP|RFcmd==RRP) len=32;
else len=0;
RF905_CSNL; // Spi enable for write a spi command
RFSpiWrite(RFcmd);
for(i=0;i<len;i++) RFdata[i]=RFSpiRead();
RF905_CSNH;
}
void RF905_Write(uint8 RFcmd,uint8 *RFdata)
{
uint8 i,len;
if(RFcmd==WTA|RFcmd==RTA) len=4;
else if(RFcmd==WC|RFcmd==RC) len=10;
else if(RFcmd==WTP|RFcmd==RTP|RFcmd==RRP) len=32;
else len=0;
RF905_CSNL; // Spi enable for write a spi command
RFSpiWrite(RFcmd);
for(i=0;i<len;i++) RFSpiWrite(RFdata[i]); // len Bytes Data
RF905_CSNH; // Disable Spi
}
void TxPacket(void)
{
ChangeMode(TXMode);
RF905_Write(WTP,Databuf); // Spi disable
Delayus(1);
RF905_Write(WTA,TX_ADDRESS); // Spi disable
ChangeMode(TXData);
RF905_PWRH; // Set TRX_CE low
ChangeMode(RXMode);
}
void RxPacket(void)
{ //uint i;
RF905_TRX_ENL;
_delay_loop_(1); // Set nRF905 in standby mode
RF905_Read(RRP,Databuf);
RF905_TRX_ENH;
_delay_loop_(1);
}
/////////////////////////////////////////////////////////////////////////////
void RFSpi_init(void)
{
OUTRF905_ACSN;
OUTRF905_ADOUT;
OUTRF905_ASCLK;
OUTRF905_ATX_EN;
OUTRF905_APWR;
INRF905_ADRDY;
INRF905_ADIN;
RF905_ACSNH;//RFCSN = 1;
RF905_ASCLKL;//RFSCK = 0;
//RFMOSI = 1;
RF905_ADOUTH;//RFMISO = 1;
OUTRF905_CSN;
OUTRF905_DOUT;
OUTRF905_SCLK;
OUTRF905_TX_EN;
OUTRF905_PWR;
INRF905_DRDY;
INRF905_DIN;
RF905_CSNH;//RFCSN = 1;
RF905_SCLKL;//RFSCK = 0;
//RFMOSI = 1;
RF905_DOUTH;//RFMISO = 1;
}
////////////////////////////////////////////////////////////
typedef struct
{
uint8 datab; // 字长度,5/6/7/8可选
uint8 stopb; // 停止位,1/2可选
uint8 parity; // 奇偶校验位,0-无校验,1-奇校验,2-偶校验
}COMMMODE;
void __irq IRQ_UART0 (void);
int8 UART0_Init (uint32 baud, COMMMODE set)
{
uint32 bak;
// 设置I/O连接到UART0
PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05; /* 选择管脚为UART0 */
/* 参数过滤 */
if ((baud ==0 ) || (baud > 115200)) return (0);
if ((set.datab <5) || (set.datab > 8)) return (0);
if ((set.stopb == 0) || (set.stopb > 2)) return (0);
if (set.parity > 4) return (0);
/* 设置串口波特率 */
U0LCR = 0x80; // DLAB = 1
bak = (Fpclk >> 4) / baud;
U0DLM = bak >> 8;
U0DLL = bak & 0xFF;
/* 设置串口模式 */
bak = set.datab - 5; // 设置字长
if (set.stopb == 2) bak |= 0x04; // 判断是否为2位停止位
if (set.parity != 0)
{
set.parity = set.parity - 1;
bak |= 0x08;
}
bak |= set.parity << 4; // 设置奇偶校验
U0LCR = bak;
U0IER = 0x03; /* 允许接收和发送中断 */
U0FCR = 0x07; /* 禁止FIFO */
VICVectCntl2 = 0x20 | 6; // 分配Timer0中断到向量中断0
VICVectAddr2 = (uint32)IRQ_UART0; // 设置中断服务程序地址
VICIntEnable = (1 << 6);
return (1);
}
void __irq IRQ_UART0 (void)
{
VICVectAddr = 0x00; // 中断处理结束
}
void InitTCom(void)
{
COMMMODE set;
set.datab = 8; //8位数据位
set.stopb = 1; //1位停止位
set.parity = 0; //无奇偶校验
UART0_Init(9600,set);
}
void UART0_SendByte (uint8 dat)
{
U0THR = dat;
while ((U0LSR & 0x40) == 0); // 等待数据发送完毕
}
void Uart0_Printf (char *str)
{
while (1)
{
if (*str == '\0')
{
break; // 遇到结束符,退出
}
UART0_SendByte(*str++); // 发送数据
}
}
//////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
int main(void)
{
uint8 TxCount;
uint16 i,len;
RFSpi_init();
InitTCom();
Uart0_Printf( " 通过串口0测试RF905\r\n" ) ;
//发送端初始化
ChangeModeA(Standby); // nRF905进入待机SPI通讯模式
Delayus(1000);
Config905A(); //配置nRF905
Delayus(1000);
memset(Databuf,0,sizeof(Databuf));
RF905_ReadA(RC,Databuf);
//接收断初始化
ChangeMode(Standby); // nRF905进入待机SPI通讯模式
Delayus(1000);
Config905(); //配置nRF905
Delayus(1000);
memset(Databuf,0,sizeof(Databuf));
RF905_Read(RC,Databuf);
ChangeMode(RXMode); //启动接受模式
TxCount = 0;
while(1)
{
Delayus(1000);
Delayus(65000);
Delayus(65000);
Delayus(65000);
memset(Databuf,0,sizeof(Databuf));
len = sizeof(Databuf);
for(i=0; i<len; i++)
{
Databuf[i] =i +TxCount+'A';
}
//发送数据
ChangeModeA(RXMode); //启动接受模式
for(i=0;i<0x1000;i++)
{
if(JUDGE_RF905_ACD) //判断CD信号,有数据接收不能发送
{
}
else
{
TxPacketA(); //发送数据/
TxCount++;
if(TxCount > 10 )
{
TxCount = 0;
}
//memset(Databuf,0,sizeof(Databuf));
//读取发送有效数据
memset(Databuf,0,sizeof(Databuf));
RF905_ReadA(RTP,Databuf);
//读取发送的接收方地址
memset(Databuf,0,sizeof(Databuf));
RF905_ReadA(RTA,Databuf);
memset(Databuf,0,sizeof(Databuf));
break;
}
}
Delayus(25000);
//接收数据
ChangeMode(RXMode); //启动接受模式
//数据包发送出去,进行接收
if(i!=0x1000)
{
for(i=0;i<0x1000;i++)
{
if(JUDGE_RF905_DRDY) //数据准备就绪 表示接收完成或发送完成
{
memset(Databuf,0,sizeof(Databuf));
RxPacket();
Uart0_Printf("RF905收到下面字符: ");
Uart0_Printf((char *)Databuf);
Uart0_Printf("\r\n\r\n");
break;
} //等待接受数据
}
}
_delay_loop_(65000);
_delay_loop_(10000);
}
return(0);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -