OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3036|回复: 4

STM32F0xx SPI NRF24L01驱动求助

[复制链接]

16

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-4-4
在线时间
54 小时
发表于 2019-1-17 20:33:02 | 显示全部楼层 |阅读模式
1金钱
芯片是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;


最佳答案

查看完整内容[请看2#楼]

自行解决了 贴上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_ ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-4-4
在线时间
54 小时
 楼主| 发表于 2019-1-17 20:33:03 | 显示全部楼层
自行解决了

贴上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;         //返回读取到的数据
}
回复

使用道具 举报

16

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-4-4
在线时间
54 小时
 楼主| 发表于 2019-1-18 14:29:37 | 显示全部楼层
自己顶
回复

使用道具 举报

0

主题

2

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2057
金钱
2057
注册时间
2016-1-15
在线时间
123 小时
发表于 2019-2-13 10:29:43 | 显示全部楼层
原来你是用软件SPI解决的。
回复

使用道具 举报

9

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1694
金钱
1694
注册时间
2014-7-8
在线时间
183 小时
发表于 2019-3-1 08:53:32 | 显示全部楼层
软件SPI的解决方法还是不错的!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 17:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表