初级会员
- 积分
- 158
- 金钱
- 158
- 注册时间
- 2015-4-12
- 在线时间
- 13 小时
|
5金钱
之前参考原子哥代码写了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,感觉整个输出都右移了,相当于输出有延时,我在代码中加入延时液没有用,还是一样的,但不论我是用<span style="line-height:23.3333px;">FLASH_INIT();还是<span style="line-height:23.3333px;">NRF2401_Init(),调用SPI1_Init();初始化SPI1,但SPI_FLASH却能正常使用,这两个函数中调用的SPI_Init();配置都是一样的,都是第一个上升沿捕获,时钟相性为常低和第一边缘捕获,原子个说过</span>复位外设寄存器就是将相关外设寄存器复位成默认值,可是为啥对SPI_Flash没什么影响,对NRF24L01就影响那么大,我都卡在这好久了,都快崩溃了,希望原子哥能帮我好好解答下,谢谢了。<br />
<br />
void NRF24L01_Init(void)<br />
{<br />
GPIO_InitTypeDef GPIO_InitStructure;<br />
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOG,ENABLE);<br />
<br />
GPIO_SetBits(GPIOB,GPIO_Pin_14);//SPI片选失能,防止产生干扰<br />
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;<br />
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;<br />
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;<br />
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;<br />
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;<br />
GPIO_Init(GPIOB,&GPIO_InitStructure);<br />
<br />
<br />
GPIO_SetBits(GPIOG,GPIO_Pin_7);//NRF片选失能<br />
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;<br />
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;<br />
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;<br />
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;<br />
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;<br />
GPIO_Init(GPIOG,&GPIO_InitStructure);<br />
<br />
<br />
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;<br />
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;<br />
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;<br />
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;<br />
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;<br />
GPIO_Init(GPIOG,&GPIO_InitStructure);<br />
<br />
GPIO_ResetBits(GPIOB,GPIO_Pin_14);<br />
GPIO_SetBits(GPIOB,GPIO_Pin_14);//SPI片选失能,防止产生干扰<br />
SPI1_Init();<br />
NRF_CE_LOW;<br />
NRF_CS_DISABLE;<br />
if(NRF24L01_Check())<br />
GUI_Text(0,48,"WIRELESS IS ERROR!",24,RED,WHITE);<br />
else<br />
{ <br />
NRF24L01_Write_Buf(W_REGISTER+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//设置本地通道0要接收的地址<br />
NRF24L01_Write_Buf(W_REGISTER+TX_ADDR,(u8 *)TX_ADDRESS,TX_ADR_WIDTH);//设置发送时的本地地址<br />
NRF24L01_REG(W_REGISTER+EN_AA,0x00);//自动应答关闭<br />
NRF24L01_REG(W_REGISTER+EN_RXADDR,0x00);//设置默认通道<br />
NRF24L01_REG(W_REGISTER+SETUP_RETR,0x00);//自动重发关闭<br />
NRF24L01_REG(W_REGISTER+SETUP_AW,RX_ADR_WIDTH);//设置接收地址长度<br />
NRF24L01_REG(W_REGISTER+RF_CH,0x00);//2.4GHz<br />
NRF24L01_REG(W_REGISTER+RF_SETUP,0x07);//2MHZ传输, 0dB发射<br />
NRF24L01_REG(W_REGISTER+RX_PW_P0,RX_PLOAD_WIDTH);//设置通道接收的数据长度<br />
NRF24L01_REG(W_REGISTER+CONFIG,0x0E);//主发送,收发完成中断,16CRC<br />
GUI_Text(0,48,"WIRELESS IS OK!",24,RED,WHITE);<br />
}<br />
<br />
}<br />
u8 NRF24L01_Check(void)<br />
{<br />
<br />
u8 buf[TX_ADR_WIDTH]={0x88,0x88,0x88,0x88,0x88};<br />
u8 i,s=0;<br />
SetSpeed(SPI_BaudRatePrescaler_128);<br />
NRF24L01_Write_Buf(W_REGISTER+TX_ADDR,buf,TX_ADR_WIDTH);//设置本地通道0要接收的地址<br />
buf[0]=0x01;buf[4]=0xff;<br />
delay_us(2);<br />
NRF24L01_Read_Buf(R_REGISTER+TX_ADDR,buf,RX_ADR_WIDTH);<br />
for(i=0;i<TX_ADR_WIDTH;i++)<br />
{<br />
if(buf!=0x88)s=1;//break;<br />
printf("buf:%02x\r\n",buf);<br />
}<br />
if(s)return 1;<br />
return 0;<br />
}<br />
void Flash_Init(void)<br />
{<br />
GPIO_InitTypeDef GPIO_InitStructure;<br />
<br />
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);<br />
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);<br />
<br />
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;<br />
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;<br />
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;<br />
GPIO_Init(GPIOB,&GPIO_InitStructure);<br />
GPIO_SetBits(GPIOB,GPIO_Pin_14);<br />
<br />
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;<br />
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;<br />
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;<br />
GPIO_Init(GPIOB,&GPIO_InitStructure);<br />
GPIO_SetBits(GPIOG,GPIO_Pin_7);<br />
SPI1_Init();<br />
SetSpeed(SPI_BaudRatePrescaler_2);<br />
W25QX_TYPE=W25QXX_ReadID();<br />
}<br />
<br />
void SPI1_Init(void)<br />
{<br />
GPIO_InitTypeDef GPIO_InitStructure;<br />
SPI_InitTypeDef SPI_InitStructure;<br />
<br />
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);<br />
<br />
SPI_Cmd(SPI1,DISABLE);<br />
<br />
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;<br />
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;<br />
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;<br />
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;<br />
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;<br />
GPIO_Init(GPIOB,&GPIO_InitStructure);<br />
<br />
GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1);<br />
GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1);<br />
GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1);<br />
<br />
//这里只针对SPI口初始化<br />
// RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1<br />
// RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1<br />
<br />
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; <br />
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; <br />
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; <br />
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; <br />
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; <br />
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //SPI_NSS_Hard<br />
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; <br />
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; <br />
SPI_InitStructure.SPI_CRCPolynomial = 7; <br />
SPI_Init(SPI1,&SPI_InitStructure);<br />
SPI_Cmd(SPI1,ENABLE);<br />
ReadWriteByte(0XFF);<br />
}<br />
<br />
int main()<br />
{<br />
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);<br />
delay_init(168);<br />
LCD_Init();<br />
LED_Init();<br />
BEEP_Init();<br />
KEY_Init();<br />
Remote_Init();<br />
uart_init(460800);<br />
usmart_dev.init(84);<br />
Flash_Init();<br />
TPAD_Init(8);<br />
RTC_Config();<br />
IIC_Init();<br />
Temp_Init();<br />
NRF24L01_Init();//<span style="line-height:23.3333px;">Flash_Init();和NRF24L01(),不放在一起就会出错。</span><br />
while(1)<br />
{<br />
}<br />
<br />
</span> |
|