STC12单片机SPI多对一nrf24l01程序 联系客服

发布时间 : 星期五 文章STC12单片机SPI多对一nrf24l01程序更新完毕开始阅读b3f459a3f90f76c661371a74

while(j--); } }

/************初始化5A spi***************/ void Init_SPI() {

SPDAT=0; //初始化数据寄存器 SPSTAT=0XC0; //清除状态寄存器

SPCTL=0XD2;//设置为主机模式 主频不能超过2M

//忽略SS 使能spi MSB SCLK空闲为0 第一个时钟边沿开始采集 spi通信的频率为CUP_CLK/16 }

//SPDAT 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节

uchar SPI_ReadWriteByte(uchar TxData) { }

//读取SPI寄存器值 //reg:要读的寄存器

uchar SPI_Read_Reg(uchar reg) {

uchar reg_val;

//发送一个byte

SPDAT=TxData; SPSTAT=0XC0;

while((SPSTAT&0x80)==0);

//清除状态寄存器

return SPDAT; //返回收到的数据

CSN = 0; //使能SPI传输

SPI_ReadWriteByte(reg); //发送寄存器号

reg_val=SPI_ReadWriteByte(0xFF);//读取寄存器内容 CSN = 1; //禁止SPI传输

return(reg_val); //返回状态值 }

// 向寄存器REG写一个字节,同时返回状态字节 reg寄存器地址 value写入的数据 uchar SPI_RW_Reg (uchar reg,uchar value) {

uchar status;

}

CSN=0;

status=SPI_ReadWriteByte(reg);//发送寄存器号 SPI_ReadWriteByte(value); //写入寄存器的值 CSN=1;

return(status);

//写一个数据包

uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes) {

uchar status,byte_ctr; CSN = 0;

status=SPI_ReadWriteByte(reg);

for(byte_ctr=0; byte_ctr

//读一个数据包

uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) { }

//*******************************void TX_Mode(void) { CE=0;

SPI_RW_Reg(FLUSH_TX,0x00);

SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写发送的地址 Writes TX_Address to nRF24L01

SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, TX_ADDRESS, TX_ADR_WIDTH); // 写接受的地址 RX_Addr0 same as TX_Adr for Auto.Ack

SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //**使能自动应答 Enable Auto.Ack:Pipe0 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); //**使能通道0 Enable Pipe0

SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // **自动重发功能设置 500us + 86us, 10 retrans...1a

*****

*****

*****

*****

*****

uchar status,uchar_ctr; CSN = 0; status = SPI_ReadWriteByte(reg);

for(uchar_ctr=0;uchar_ctr

return(status);

*************************************/

SPI_RW_Reg(WRITE_REG + RF_CH, 40); //收发频率

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 发射速率、功耗功能设置 TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR

SPI_RW_Reg(WRITE_REG + RX_PW_P1, (unsigned char)RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为2字节

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); CE=1;

delay_ms(100); }

void Transmit(unsigned char * tx_buf) { }

CE=0; //StandBy I模式

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); //装载接收端地址 SPI_RW_Reg(FLUSH_TX,0x00); //清除FIFO

SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送 CE=1; //置高CE,激发数据发送 delay_ms(150);

/************************************uchar NRF24L01_Check(void) { } {

TMOD=0x20;//设置定模式2 TH1=0xFD; TL1=0xFD;

SM1=1; //设置串口SCON,为方式1 SM0=0;

REN=1; //串行允许 TR1=1; //启动定时器 EA=1; //中断 ES=1; //打开串口

uchar buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5}; uchar i;

************************************************************/

SPI_Write_Buf(WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址. SPI_Read_Buf(TX_ADDR,buf,5); //读出写入的地址 for(i=0;i<5;i++) if(buf[i]!=0XA5) break; if(i!=5) return 1;//检测24L01错误 return 0;

//检测到24L01

void init()

}

void main() {

}

if(MAX_RT) //如果是发送超时 {

Tx_Buf[1]=0x25;

ES=0; //发送时关闭中断 SBUF=0x00;

while(!TI); //等待发送完成,发送完成后TI为1 TI=0; ES=1;

Transmit(Tx_Buf); Delay(10);

sta=SPI_Read_Reg(READ_REG + STATUS); if(TX_DS) {

led=0; //8位LED显示当前STATUS状态 发送中断应使bit5 = 1 灯灭 Delay(100);

SPI_RW_Reg(WRITE_REG + STATUS,sta);

//清除FIFO

TX_Mode();

while(1) {

}

delay_ms(500); led=!led;

while(NRF24L01_Check())//检测不到24L01 {

delay_ms(500); init(); uint i=0; CE=0; CSN=1; Init_SPI();