完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我先把SPI输入输出短路,可以收到发送的数据,又用GPIO模拟SPI发送,nrf24l01是可以发送数据的,可是用硬件SPI控制nrf24l01就出现问题,给nrf寄存器写值时,可以返回一些值,这应该说明SPI是通的吧?但是一用SPI_Read读取写入的值就发现,就返回0x00,这到底是怎么回事啊??各位大神帮帮忙!!
部分程序如下: //**************************************************************************************** //*NRF24L01初始化 //***************************************************************************************/ void init_NRF24L01(void) { Delay_us(1200); //1.2ms??? CE=0; // chip enable CSN=1; // Spi disable //SCK=0; // Spi clock line init high //check=SPI_Read(READ_REG+STATUS); st=SPI_RW_Reg(WRITE_REG+STATUS,0xFF); check=SPI_Read(READ_REG+STATUS); st=SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址,频道0 check=SPI_Read_Buf(READ_REG+RX_ADDR_P0, RX_ADDRESS1, RX_ADR_WIDTH); // SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许 SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); // 频道0自动 禁止ACK应答,debug // SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00); // 禁止接收地址只有频道0,debug // SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); //设置重发时间间隔:500us+86us,最大自动重发次数:10次 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00); // 失能自动重发,debug st=SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 设置信道工作为2.4GHZ,收发必须一致 check=SPI_Read(READ_REG+RF_CH); st=SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f); //设置发射速率为2MHZ,发射功率为最大值0dB check=SPI_Read(READ_REG+RF_SETUP); } uchar SPI_Read(uchar reg) { uchar reg_val; CSN = 0; Delay_us(1); // CSN low, initialize SPI communication... SPI_RW(reg); // Select register to read from.. reg_val = SPI_RW(0x0); // ..then read registervalue CSN = 1; // CSN high, terminate SPI communication return(reg_val); // return register value } //****************************************************************************************************/ //*功能:NRF24L01读写寄存器函数 //写数据value到reg寄存器 //****************************************************************************************************/ uchar SPI_RW_Reg(uchar reg, uchar value) { uchar status; CSN = 0; Delay_us(1); // CSN low, init SPI transaction status = SPI_RW(reg); // select register st=SPI_RW(value); // ..and write value to it.. CSN = 1; // CSN high again return(status); // return nRF24L01 status uchar } //****************************************************************************************************/ //*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) //*功能: 用于读数据,reg:为寄存器地址pBuf:为待读出数据地址,uchars:读出数据的个数 //****************************************************************************************************/ uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) { uchar status,uchar_ctr; CSN = 0; Delay_us(1); // Set CSN low, init SPI tranaction status = SPI_RW(reg); // Select register to write to and read status uchar for(uchar_ctr=0;uchar_ctr pBuf[uchar_ctr] = SPI_RW(0); Delay_us(1); } CSN = 1; return(status); // return nRF24L01 status uchar } //********************************************************************************************************* //*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) //*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写数据个数 //*********************************************************************************************************/ uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) { uchar status,uchar_ctr; CSN = 0; Delay_us(1); //SPI使能 status = SPI_RW(reg); for(uchar_ctr=0; uchar_ctr st=SPI_RW(*pBuf++); // Delay_us(1); } CSN = 1; //关闭SPI return(status); // } void InitSpi(void) { // Initialize SPI-A: //configure control register SpiaRegs.SPICCR.all= 0x07; //进入初始状态,数据在上升沿输出,自测禁止,8位数据模式 //configure operation register SpiaRegs.SPICTL.all= 0x06; //clock开始为低电平,master,enable transmit,disable interrupt //set SPI BaudRate SpiaRegs.SPIBRR =0x0; //baudrate=LSPCLK/4=4.6875MHZ SpiaRegs.SPICCR.all= 0x87; //退出初始状态,准备发送 //tbd... } unsigned int Spi_TxReady(void) { unsigned int i; if(SpiaRegs.SPISTS.bit.BUFFULL_FLAG==1) { i=0; bufflag0++; } else { i=1; bufflag1++; } return(i); } unsigned int Spi_RxReady(void) { unsigned int i; if(SpiaRegs.SPISTS.bit.INT_FLAG==1) { i=1; } else { i=0; } return(i); } uchar SPI_RW(uchar uuchar) { if(Spi_TxReady()==1) //TxBuff未满,SPITXBUF不用初始化为0? { SpiaRegs.SPITXBUF=(((unsigned char)uuchar<<8)+0x00); //数据写入SPI发送缓冲区 //spitxbuf++; } while(Spi_TxReady()!=1); // GpioDataRegs.GPFDAT.bit.GPIOF3 = 1; while(Spi_RxReady()!=1); //RXBUFF已接受完一个字 // while(Spi_RxReady()==1) // { out=SpiaRegs.SPIDAT; uuchar=(out&0xff); // } return(uuchar); // return read uchar } |
|
相关推荐
1个回答
|
|
今天下午用示波器对比一下用GPIO口模拟SPI和SPI的输入输出波形,发现MOSI都是一样的,但是当输入寄存器地址是SPI的SOMI相比于模拟SPI落后一个时钟输出,并且用reg_read(0)时,硬件SPI读得都是0,我用GPIO模拟SPI是可以通信的,为什么硬件SPI就不行了呢?到底是哪出问题了,各位大神帮帮忙!!还有,用硬件SPI时,MOSI输出寄存器地址和读/写寄存器值时,中间相比于GPIO口模拟SPI有较长的时间间隔,这个有问题吗?PS:附件是对比波形图
|
|
|
|
只有小组成员才能发言,加入小组>>
物联网工程师必备:怎么选择不同的无线连接技术,本指南帮你忙!
3263 浏览 1 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】WIFI功能测试
3914 浏览 0 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】Arduino的替代SublimeText3+STino
3420 浏览 0 评论
使用端口扩展器轻松高效地向IIoT端点添加具有成本效益的子节点
3972 浏览 1 评论
20630 浏览 11 评论
模组有时候复位重启后输出日志为“REBOOT_CAUSE_SECURITY_PMU_POWER_ON_RESET”的原因?
756浏览 2评论
945浏览 2评论
967浏览 1评论
1087浏览 1评论
364浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 13:12 , Processed in 0.904964 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号