发布时间 : 星期五 文章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();