STM32F0xx SPI NRF24L01驱动求助

2019-07-21 04:51发布

芯片是F070的 用的不多 前后的SPI用HAL库、标准库和软件模拟都试了,没能成功驱动 表现就是SPI读不出数据,也没发现哪出问题,因此求助。
贴上代码

/***********************************SPI部分*************************************/

extern SPI_HandleTypeDef hspi1;

//SPI初始化
void SPI_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    __HAL_RCC_GPIOA_CLK_ENABLE();

    HAL_GPIO_WritePin(GPIOA, SPI_CLK_PIN|SPI_MISO_PIN|SPI_MOSI_PIN, GPIO_PIN_SET);

#if USE_HW_SPI

//         HAL_SPI_MspInit(&hspi1);
        __HAL_RCC_SPI1_CLK_ENABLE();
       
        GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
    GPIO_InitStruct.Pin = SPI_CLK_PIN|SPI_MISO_PIN|SPI_MOSI_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
       
    /* SPI1 parameter configuration*/
    hspi1.Instance = SPI1;
    hspi1.Init.Mode = SPI_MODE_MASTER;
    hspi1.Init.Direction = SPI_DIRECTION_2LINES;
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi1.Init.NSS = SPI_NSS_SOFT;
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi1.Init.CRCPolynomial = 7;
    hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
    hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
    if (HAL_SPI_Init(&hspi1) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
        __HAL_SPI_ENABLE(&hspi1);
#else

        GPIO_InitStruct.Pin = SPI_CLK_PIN|SPI_MOSI_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
       
    GPIO_InitStruct.Pin = SPI_MISO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
#endif

}

//SPI发送一个字节
u8 SPI_ReadWriteByte(u8 dat)
{
#if USE_HW_SPI
       
    uint8_t rev_dat;
        HAL_SPI_TransmitReceive(&hspi1,&dat,&rev_dat,1,1000);        
        return rev_dat;

#else
    for(u8 i=0; i<8; i++)
    {
        if(dat&0x80)
                        SPI_MOSI_H();
        else
                        SPI_MOSI_L();

//        Delay_us(1);
        dat <<= 1;

        SPI_CLK_H();        //第一个时钟

//                Delay_us(1);
        if(SPI_MISO_READ())       
                        dat |= 0x01;
                else
                        ;;

        SPI_CLK_L();//第二个时钟
    }
    return dat;
#endif

}




/***********************************2401 检测部分******************************/
    uint64_t temp=0,r_temp=0,w_temp=0x123456789AULL;

    u8 err_sta = ERROR;

    NRF24L01_CE_L();

    NRF24L01_ReadBuf(READ_REG_CMD + TX_ADDR,(u8*)&temp,5);         //读出数据
    NRF24L01_WriteBuf(WRITE_REG_CMD + TX_ADDR,(u8*)&w_temp,5);     //写入新数据
    NRF24L01_ReadBuf(READ_REG_CMD + TX_ADDR,(u8*)&r_temp,5);       //读出数据

    if(r_temp == w_temp)
    {
        NRF24L01_WriteBuf(WRITE_REG_CMD + TX_ADDR,(u8*)&temp,5);    //还原数据
        err_sta = SUCCESS ;
    }
    else
        err_sta = ERROR ; //MCU与NRF不正常连接

    NRF24L01_CE_H();

    return err_sta;


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
qq997758497
1楼-- · 2019-07-21 07:32
自行解决了

贴上SPI部分代码
void SPI_Configration(void)
{
    GPIO_InitTypeDef  GPIO_InitStructureure;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

        //CS
        GPIO_InitStructureure.GPIO_Pin = SPI_CS_PIN;
        GPIO_InitStructureure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructureure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructureure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructureure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(SPI_CS_PORT,&GPIO_InitStructureure);
    //SCK
        GPIO_InitStructureure.GPIO_Pin = SPI_SCK_PIN;
        GPIO_InitStructureure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructureure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructureure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructureure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(SPI_SCK_PORT,&GPIO_InitStructureure);
    //MISO
        GPIO_InitStructureure.GPIO_Pin = SPI_MISO_PIN;
        GPIO_InitStructureure.GPIO_Mode = GPIO_Mode_IN;
        GPIO_InitStructureure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructureure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_InitStructureure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SPI_MISO_PORT,&GPIO_InitStructureure);
    //MOSI
        GPIO_InitStructureure.GPIO_Pin = SPI_MOSI_PIN;
        GPIO_InitStructureure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructureure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructureure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructureure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(SPI_MOSI_PORT,&GPIO_InitStructureure);

    SPI_CS_HIGH;
    SPI_SCK_LOW;
}


u8 SPI_ReadWriteByte(u8 dat)
{
    u8 i;
    SPI_SCK_LOW;     //先将时钟线拉低
    for(i=0;i<8;i++)
    {   
        if((dat&0x80)==0x80)  //从高位发送
        {
            SPI_MOSI_HIGH;
        }
        else
        {
            SPI_MOSI_LOW;
        }

        SPI_SCK_HIGH;  //将时钟线拉高,在时钟上升沿,数据发送到从设备

        dat<<=1;

        if(SPI_MISO_READ)   //读取从设备发射的数据
        {
            dat|=0x01;     
        }
        SPI_SCK_LOW;     //在下降沿数据被读取到主机
    }

    return dat;         //返回读取到的数据
}
qq997758497
2楼-- · 2019-07-21 10:02
自己顶
xiongxiangsheng
3楼-- · 2019-07-21 12:29
原来你是用软件SPI解决的。
xzh5508
4楼-- · 2019-07-21 13:44
 精彩回答 2  元偷偷看……

一周热门 更多>