C8051F的nRF24L01 PTR6000无线收发
SPI1->
SPI1->
void dat_int(void)
{
CSN_HIGH;
CE_LOW;
a=0;
c=0;
}
void sysclk(void) //内部晶振
{
OSCICL=0xb3; // 0x83
OSCICN=0xc2; //二分频
CLKSEL=0x00;
}
//延时子函数us
void delay(uint i)
{
while(i--)
;
}
uchar SPI_RW(uchar byte) //用SPI读写一字节的数据
{
uchar rbyte;
SPI0DAT=byte;
while(!SPIF);
rbyte=SPI0DAT;
SPIF=0;
delay(15);
return rbyte;
}
uchar SPI_RW_Reg(uchar reg,uchar value) //向寄存器写一字节的数据,同时返回状态字
{
uchar status;
CSN_LOW;
SPI0DAT=reg;
while(!SPIF);
delay(20);
status=SPI0DAT;
SPIF=0;
SPI0DAT=value;
while(!SPIF);
SPIF=0;
CSN_HIGH;
return(status);
}
uchar SPI_Read(uchar reg) //从寄存器读出一字节的数据
{
uchar byte;
CSN_LOW;
SPI0DAT=reg;
while(!SPIF);
delay(20);
SPI0DAT=0x00;
SPIF=0;
while(!SPIF);
byte=SPI0DAT;
SPIF=0;
CSN_HIGH;
return byte;
}
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes) //从reg读出bytes字节的数据
{
uchar status,byte_ctr;
CSN_LOW;
status=SPI_RW(reg);
for(byte_ctr=0;byte_ctr
CSN_HIGH;
return status;
}
uchar SPI_RW_Buf(uchar reg,uchar *pBuf,uchar bytes) //向reg写入bytes字节的数据
{
uchar status,byte_ctr;
CSN_LOW;
status=SPI_RW(reg);
for(byte_ctr=0;byte_ctr
CSN_HIGH;
return(status);
}
//接收函数,接收返回1表示有数据收到
uchar nRF24L01_RxPacket(uchar *rx_buf)
{
uchar sta;
uchar revale=0;
SPI_RW_Reg(WRITE_REG+CONFIG,0X0F);
SPI_RW_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//定义接收通道号
CE_HIGH; //开始接收数据
delay(130);
sta=SPI_Read(READ_REG+STATUS);//接收状态寄存器,用于判断是否收到数据
if(sta&0x40)
{
CE_LOW; //结束接收数据
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
revale=0xff;
}
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收复位
return revale;
}
void nRF24L01_TxPacket(uchar *tx_buf) //发送函数
{
CE_LOW;
SPI_RW_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //给发送寄存器写入地址,宽度为TX_ADR_WIDTH
SPI_RW_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//给接收寄存器写入地址,宽度也为TX_ADR_WIDTH
SPI_Read_Buf(RX_ADDR_P0,rx_buf,TX_ADR_WIDTH);
SPI_RW_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); //向发送寄存器写入TX_PLOAD_WIDTH宽度的数据,
SPI_RW_Reg(WRITE_REG+CONFIG,0X0E); //配置为PWR_UP位,使能CRC,16位校验,发送模式
CE_HIGH;
delay(100);
CE_LOW;
}
void nRF24L01_Config() //nRF24L01的配置函数
{
CE_LOW;//芯片使能
CSN_HIGH;//SPI复位
SPI_RW_Reg(WRITE_REG+CONFIG,0X0F); //使能接收模式
SPI_Read(CONFIG);
SPI_RW_Reg(WRITE_REG+EN_AA,0X01);//数据通道0自动应答
SPI_Read(EN_AA);
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0X01); //通道0允许
SPI_RW_Reg(WRITE_REG+SETUP_AW,0X02); //设置地址宽度为4字节
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X1A);//建立自动重发,500+86us,10次重发
SPI_RW_Reg(WRITE_REG+RF_CH,0x02);//设置工作通道频率
SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07);//设置工作通道传输速率为1Mbps,发射功率为0dBm
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//设置通道0有效数据宽度RX_PLOAD_WIDTH
}
void SPI(void) //SPI初始化
{
SPI0CFG=0x40;
SPI0CN=0x01; //0000 0001最后一位是SPI使能位 SPI工作在三线主方式
SPI0CKR=0x2f; //SPI时钟频率设置为150kHz 0x6f 0x2f
}
void Interrupt_int(void) //中断设定
{
IE=0x40; //允许SPI中断请求
IP=0x00; //SPI为低优先级
}
void pio(void) // 端口配置
{
P0MDIN=0xff; //禁止模拟输入,0为模拟,1为数字
P0MDOUT=0xff; //0为开漏,1为推挽(ff)
P0SKIP=0x00;
P1MDIN=0xff;
P1MDOUT=0xff; //低四位用于138
P2MDIN=0xff; //禁止模拟输入,0为模拟,1为数字
P2MDOUT=0xff; //0为开漏,1为推挽(ff)
P3MDIN=0xff;
P3MDOUT=0xff; //低四位用于138
XBR0=0x02;
XBR1=0x40;
//P0=0xff;
}
void sysclk(void);
void pio(void);
void SPI(void);
void Interrupt_int(void);
void delay(uint i);
void dat_int(void);
void main(void) //主程序
{
PCA0MD &= ~0x40;// 关闭看门狗
pio();
sysclk();
SPI(); //SPI0DAT是SPI的数据寄存器
Interrupt_int();
EA=0;
dat_int();
nRF24L01_Config(); //nRF24L01的配置函数
while(1)
{
//nRF24L01_TxPacket(tx_buf);
nRF24L01_RxPacket(rx_buf);
sta=SPI_Read(READ_REG+FIFO_STATUS);
P1=rx_buf[2];
C8051FnRF24L01PTR6000无线收 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)