您的位置 首页 分销

无线收发 24L01程序

24L01无线收发芯片,mcu用的是msp430f2274!#includemsp430x22x4.h>#defineuintunsignedint#defineucharunsignedcha

24L01无线收发芯片,mcu用的是msp430f2274!

#include
#define uint unsigned int
#define uchar unsigned char
//nRF24L01的数据宽度,地址宽度,以及数据界说
#define TX_ADR_WIDTH 4
#define RX_PLOAD_WIDTH 4
#define TX_PLOAD_WIDTH 4
uchar TX_ADDRESS[]={0xe7,0xe7,0xe7,0xe7};
uchar data[4]=”zhou”;
uchar rx_buf[4];
//引脚界说2274
#define CSN_HIGH P3OUT|=BIT1//P3.1操控SPI使能
#define CSN_LOW P3OUT&=~BIT1
#define CE_HIGH P3OUT|=BIT2//P3.2操控芯片发射使能
#define CE_LOW P3OUT&=~BIT2
#define IRQ P3IN&BIT3//读取P3.3的值*/
/***********模仿SPI方法***********/
#define MOSI_HIGH P3OUT|=BIT4
#define MOSI_LOW P3OUT&=~BIT4
#define MISO P3IN&BIT5
#define SCK_HIGH P3OUT|=BIT0
#define SCK_LOW P3OUT&=~BIT0
//24L01寄存器地址
#define CONFIG 0X00//装备寄存器地址
#define EN_AA 0X01//主动应答寄存器地址
#define EN_RXADDR 0X02//接纳地址使能
#define SETUP_AW 0X03//设置地址宽度
#define SETUP_RETR 0X04//树立主动重发
#define RF_CH 0X05//射频通道
#define RF_SETUP 0X06//射频寄存器
#define STATUS 0X07//状况寄存器
#define OBSERVE_TX 0X08//发送检测寄存器
#define CD 0X09//载波检测
#define RX_ADDR_P0 0X0A//数据通道0接纳地址
#define RX_ADDR_P1 0X0B
#define RX_ADDR_P2 0X0C
#define RX_ADDR_P3 0X0D
#define RX_ADDR_P4 0X0E
#define RX_ADDR_P5 0X0F
#define TX_ADDR 0X10//发送地址寄存器地址
#define RX_PW_P0 0X11//接纳地址通道0有用数据宽度
#define RX_PW_P1 0X12
#define RX_PW_P2 0X13
#define RX_PW_P3 0X14
#define RX_PW_P4 0X15
#define RX_PW_P5 0X16
#define FIFO_STATUS 0X17//FIFO状况寄存器
//SPI指令字
#define READ_REG 0X00//读寄存器指令
#define WRITE_REG 0X20//写寄存器指令
#define RD_RX_PLOAD 0X61//读有用数据指令
#define WR_TX_PLOAD 0XA0//写有用数据指令
#define FLUSH_TX 0XE1//铲除TX_FIFO应用于发射形式
#define FLUSH_RX 0XE2//铲除RX_FIFO应用于接纳形式
#define REUSE_TX_PL 0XE3//从头使用上一包有用数据
#define NOP 0XFF//空操作指令
//延时子函数us
void delay_us(uint i)
{
while(i–)
_NOP();
}
/*//SPI初始化程序2274
void SPI_INIT()
{
UCA0CTL0 |=UCMSB + UCMST + UCSYNC;// 3-pin, 8-bit SPI master
UCA0CTL1 |= UCSSEL_1; // ACLK
UCA0BR0 |= 0x03;//波特率9600
UCA0BR1 = 0;
UCA0MCTL = 0X91;
UCA0CTL1 &= ~UCSWRST;
P3SEL|=BIT0+BIT4+BIT5;
}
//正宗SPI写一字节数据到24L01,一起回来一个自己的数据2274
uchar SPI_RW(uchar byte)
{
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF=byte;
delay_us(200);
return UCA0RXBUF;
}*/
//模仿SPI方法
uchar SPI_RW(uchar byte)
{
uchar bit_ctr;
uchar a,b;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
a=(byte&0x80);
if(a!=0)
MOSI_HIGH;
else
MOSI_LOW;
byte=(byte<<1);
SCK_HIGH;
b=”P3IN”&BIT5;
if(b!=0)
byte+=1;
else;
SCK_LOW;
}
return byte;
}

//向寄存器写一字节的数据,一起回来状况字
uchar SPI_RW_Reg(uchar reg,uchar value)
{
uchar status;
CSN_LOW;
status=”SPI”_RW(reg);
SPI_RW(value);
CSN_HIGH;
return(status);
}
//向寄存器读出一字节的数据
uchar SPI_Read(uchar reg)
{
uchar byte;
CSN_LOW;
SPI_RW(reg);
byte=”SPI”_RW(0x00);//写入一个0x00,读出数据
CSN_HIGH;
return byte;
}
//读出bytes字节的数据
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes)
{
uchar status,byte_ctr;
CSN_LOW;
status=”SPI”_RW(reg);//挑选寄存器,并回来状况
for(byte_ctr=0;byte_ctr pBuf[byte_ctr]=SPI_RW(0);
CSN_HIGH;
return(status);
}
//写入bytes字节的数据
uchar SPI_RW_Buf(uchar reg,uchar *pBuf,uchar bytes)
{
uchar status,byte_ctr;
CSN_LOW;
status=”SPI”_RW(reg);
for(byte_ctr=0;byte_ctr SPI_RW(*pBuf++);
CSN_HIGH;
return(status);
}
//接纳函数,接纳回来1表明有数据收到
uchar nRF24L01_RxPacket(uchar *rx_buf)
{
uchar sta;
uchar revale=”0″;
SPI_RW_Reg(WRITE_REG+CONFIG,0X0F);
CE_HIGH;
delay_us(130);
sta=”SPI”_Read(READ_REG+STATUS);
while(sta&0x40)
{
CE_LOW;//进入搁置形式
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);/*数据宽度未界说*/
revale=”0xff”;//如果有数据收到,则点亮led
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);
return revale;
}
//发送函数
void nRF24L01_TxPacket(uchar *tx_buf)
{
//stand by 形式
CE_LOW;
//给发送寄存器写入地址,宽度为TX_ADR_WIDTH
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);
SPI_Read_Buf(RX_ADDR_P0,rx_buf,TX_ADR_WIDTH);
//向发送寄存器写入TX_PLOAD_WIDTH宽度的数据,
SPI_RW_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
//装备为PWR_UP位,使能CRC,16位校验,发送形式
SPI_RW_Reg(WRITE_REG+CONFIG,0X0E);
CE_HIGH;
delay_us(10);
CE_LOW;
}
//nRF24L01的装备函数
void nRF24L01_Config()
{
CE_LOW;//芯片使能
CSN_HIGH;//SPI复位
//使能接纳形式
SPI_RW_Reg(WRITE_REG+CONFIG,0X0F);
SPI_Read(CONFIG);
//数据通道0主动应答
SPI_RW_Reg(WRITE_REG+EN_AA,0X01);
SPI_Read(EN_AA);
//通道0答应
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0X01);
//设置地址宽度为4字节
SPI_RW_Reg(WRITE_REG+SETUP_AW,0X02);
//树立主动重发,500+86us,10次重发
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X1A);
//设置作业通道频率
SPI_RW_Reg(WRITE_REG+RF_CH,0x02);
//设置作业通道传输速率为1Mbps,发射功率为0dBm
SPI_RW_Reg(WRITE_REG+RF_SETUP,0X03);
//设置通道0有用数据宽度RX_PLOAD_WIDTH
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);

}
void IO_INIT()
{
P3DIR|=BIT0+BIT1+BIT2+BIT4;
}

void main()
{
uchar sta;
WDTCTL=”WDTPW”+WDTHOLD;
IO_INIT();
// SPI_INIT();
nRF24L01_Config();
while(1)
{
nRF24L01_TxPacket(data);
sta=”SPI”_Read(READ_REG+STATUS);
if(sta&0x20);
SPI_RW_Reg(WRITE_REG+STATUS,sta);
delay_us(10000);
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/272631.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部