完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
之前参考原子哥代码写了SPI1_Init()的初始化程序,其中没有复位SPI1外设,当我在NRF24L01中再一次调用spi_init()l初始化,来判断有没有NRF24L01,的时候,FLASH_INIT();和NRF2401_Init(),在main(),中紧挨着中间没有其他函数和代码时没有问题,能够检测到无线模块,但是无法正常使用NRF2401,当我注释掉FLASH_INIT();或者中间有调用其它函数,或者代码是,检测不到无线模块,在几个星期的调试中,我发现加入了SPI_DeInit();就可以了,我用逻辑分析仪看了下波形,如果没有用SPI_DeInit();spi输出的数据不正确,如输出0x30,0x88,0x88,0x88,0x88,0x88,结果变成了0xff,0x11,0x11,0x11,0x11,0x10,感觉整个输出都右移了,相当于输出有延时,我在代码中加入延时液没有用,还是一样的,但不论我是用FLASH_INIT();还是NRF2401_Init(),调用SPI1_Init();初始化SPI1,但SPI_FLASH却能正常使用,这两个函数中调用的SPI_Init();配置都是一样的,都是第一个上升沿捕获,时钟相性为常低和第一边缘捕获,原子个说过复位外设寄存器就是将相关外设寄存器复位成默认值,可是为啥对SPI_Flash没什么影响,对NRF24L01就影响那么大,我都卡在这好久了,都快崩溃了,希望原子哥能帮我好好解答下,谢谢了。
void NRF24L01_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOG,ENABLE); GPIO_SetBits(GPIOB,GPIO_Pin_14);//SPI片选失能,防止产生干扰 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_SetBits(GPIOG,GPIO_Pin_7);//NRF片选失能 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; GPIO_Init(GPIOG,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; GPIO_Init(GPIOG,&GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_14); GPIO_SetBits(GPIOB,GPIO_Pin_14);//SPI片选失能,防止产生干扰 SPI1_Init(); NRF_CE_LOW; NRF_CS_DISABLE; if(NRF24L01_Check()) GUI_Text(0,48,"WIRELESS IS ERROR!",24,RED,WHITE); else { NRF24L01_Write_Buf(W_REGISTER+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//设置本地通道0要接收的地址 NRF24L01_Write_Buf(W_REGISTER+TX_ADDR,(u8 *)TX_ADDRESS,TX_ADR_WIDTH);//设置发送时的本地地址 NRF24L01_REG(W_REGISTER+EN_AA,0x00);//自动应答关闭 NRF24L01_REG(W_REGISTER+EN_RXADDR,0x00);//设置默认通道 NRF24L01_REG(W_REGISTER+SETUP_RETR,0x00);//自动重发关闭 NRF24L01_REG(W_REGISTER+SETUP_AW,RX_ADR_WIDTH);//设置接收地址长度 NRF24L01_REG(W_REGISTER+RF_CH,0x00);//2.4GHz NRF24L01_REG(W_REGISTER+RF_SETUP,0x07);//2MHZ传输, 0dB发射 NRF24L01_REG(W_REGISTER+RX_PW_P0,RX_PLOAD_WIDTH);//设置通道接收的数据长度 NRF24L01_REG(W_REGISTER+CONFIG,0x0E);//主发送,收发完成中断,16CRC GUI_Text(0,48,"WIRELESS IS OK!",24,RED,WHITE); } } u8 NRF24L01_Check(void) { u8 buf[TX_ADR_WIDTH]={0x88,0x88,0x88,0x88,0x88}; u8 i,s=0; SetSpeed(SPI_BaudRatePrescaler_128); NRF24L01_Write_Buf(W_REGISTER+TX_ADDR,buf,TX_ADR_WIDTH);//设置本地通道0要接收的地址 buf[0]=0x01;buf[4]=0xff; delay_us(2); NRF24L01_Read_Buf(R_REGISTER+TX_ADDR,buf,RX_ADR_WIDTH); for(i=0;i { if(buf!=0x88)s=1;//break; printf("buf:%02xrn",buf); } if(s)return 1; return 0; } void Flash_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_14); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_SetBits(GPIOG,GPIO_Pin_7); SPI1_Init(); SetSpeed(SPI_BaudRatePrescaler_2); W25QX_TYPE=W25QXX_ReadID(); } void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE); SPI_Cmd(SPI1,DISABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1); //这里只针对SPI口初始化 // RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1 // RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //SPI_NSS_Hard SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1,&SPI_InitStructure); SPI_Cmd(SPI1,ENABLE); ReadWriteByte(0XFF); } int main() { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(168); LCD_Init(); LED_Init(); BEEP_Init(); KEY_Init(); Remote_Init(); uart_init(460800); usmart_dev.init(84); Flash_Init(); TPAD_Init(8); RTC_Config(); IIC_Init(); Temp_Init(); NRF24L01_Init();//Flash_Init();和NRF24L01(),不放在一起就会出错。 while(1) { } |
|
相关推荐
2个回答
|
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2574 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2368 浏览 5 评论
3225 浏览 3 评论
2842 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2795 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
677浏览 1评论
914浏览 0评论
1035浏览 0评论
677浏览 0评论
509浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 10:30 , Processed in 1.158692 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号