硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6050|回复: 2
收起左侧

[有问必答] SPI2初始化时进入HardFault 故障,求助。

[复制链接]

8

主题

20

回帖

44

积分

新手上路

积分
44
发表于 2016-5-1 02:54:56 | 显示全部楼层 |阅读模式
终于解决了


我试图把ADS1256.c改成硬件SPI。
使用的是SPI2,引脚为PB13,PB14,PB15
但是,初始化出现HardFault 故障
我找了一个,发现是MISO引脚,在    GPIO_PinAFConfig(GPIOB, GPIO_Pin_14, GPIO_AF_SPI2) 引起的,
具体是,    GPIO_PinAFConfig这个函数在这一句  GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ; 出现的故障。
0x080005F8 10CE      ASRS          r6,r1,#3
怎么会有这么奇怪的问题。
我用软件spi就没有问题
部分代码如下:

        /* 定义GPIO端口 */
    #define RCC_ADS1256_SCK     RCC_AHB1Periph_GPIOB
    #define PORT_ADS1256_SCK    GPIOB
    #define PIN_ADS1256_SCK        GPIO_Pin_13

    #define RCC_ADS1256_DIN     RCC_AHB1Periph_GPIOB
    #define PORT_ADS1256_DIN    GPIOB
    #define PIN_ADS1256_DIN        GPIO_Pin_15

    #define RCC_ADS1256_CS         RCC_AHB1Periph_GPIOB
    #define PORT_ADS1256_CS        GPIOB
    #define PIN_ADS1256_CS        GPIO_Pin_12

    #define RCC_ADS1256_RESET     RCC_AHB1Periph_GPIOG
    #define PORT_ADS1256_RESET    GPIOG
    #define PIN_ADS1256_RESET      GPIO_Pin_14

    #define RCC_ADS1256_PWDN       RCC_AHB1Periph_GPIOG
    #define PORT_ADS1256_PWDN     GPIOG
    #define PIN_ADS1256_PWDN      GPIO_Pin_15

    #define RCC_ADS1256_DRDY       RCC_AHB1Periph_GPIOG
    #define PORT_ADS1256_DRDY      GPIOG
    #define PIN_ADS1256_DRDY      GPIO_Pin_13

    #define RCC_ADS1256_DOUT     RCC_AHB1Periph_GPIOB
    #define PORT_ADS1256_DOUT    GPIOB
    #define PIN_ADS1256_DOUT       GPIO_Pin_14

初始化函数硬件部分:

#ifdef HARD_ADS1256_SPI        /* 硬件SPI */

    /*****************************初始化CS\RESET\PWDN\****************************/
    RCC_AHB1PeriphClockCmd(RCC_ADS1256_CS | RCC_ADS1256_RESET | RCC_ADS1256_PWDN, ENABLE);     /* 打开GPIO时钟 */

    /* 配置几个推完输出IO */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;        /* 设为输出口 */
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        /* 设为推挽模式 */
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;    /* 上下拉电阻不使能 */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;    /* IO口最大速度 */

    GPIO_InitStructure.GPIO_Pin = PIN_ADS1256_CS;
    GPIO_Init(PORT_ADS1256_CS, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = PIN_ADS1256_RESET;
    GPIO_Init(PORT_ADS1256_RESET, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = PIN_ADS1256_PWDN;
    GPIO_Init(PORT_ADS1256_PWDN, &GPIO_InitStructure);

    CS_1();

    /***************配置DRDY为浮动输入模式(实际上CPU复位后就是输入状态)***********************/
    RCC_AHB1PeriphClockCmd(RCC_ADS1256_DRDY, ENABLE);     /* 打开GPIO时钟 */

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;        /* 设为输入口 */
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        /* 设为推挽模式 */
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;    /* 无需上下拉电阻 */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    /* IO口最大速度 */

    GPIO_InitStructure.GPIO_Pin = PIN_ADS1256_DRDY;
    GPIO_Init(PORT_ADS1256_DRDY, &GPIO_InitStructure);   

    /***************配置SPI2的引脚***********************/

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);     /* 打开GPIO时钟 */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);     /* 打开SPI2时钟 */

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

    GPIO_InitStructure.GPIO_Pin = PIN_ADS1256_SCK;
    GPIO_Init(PORT_ADS1256_SCK, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = PIN_ADS1256_DIN;
    GPIO_Init(PORT_ADS1256_DIN, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = PIN_ADS1256_DOUT;
    GPIO_Init(PORT_ADS1256_DOUT, &GPIO_InitStructure);

    /* 配置 SCK, MISO 、 MOSI 为复用功能 */
    GPIO_PinAFConfig(PORT_ADS1256_SCK, PIN_ADS1256_SCK, GPIO_AF_SPI2);
    GPIO_PinAFConfig(GPIOB, GPIO_Pin_14, GPIO_AF_SPI2);
    GPIO_PinAFConfig(PORT_ADS1256_DIN, PIN_ADS1256_DIN, GPIO_AF_SPI2);

    /***************配置SPI2***********************/   

    /* 配置SPI硬件参数 */
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;    /* 数据方向:2线全双工 */
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;        /* STM32的SPI工作模式 :主机模式 */
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;    /* 数据位长度 : 8位 */
    /* SPI_CPOL和SPI_CPHA结合使用决定时钟和数据采样点的相位关系、
       本例配置: 总线空闲是低电平,第2个边沿(上升沿采样数据)
    */
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;            /* 时钟上升沿采样数据 */
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        /* 时钟的第2个边沿采样数据 */
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;            /* 片选控制方式:软件控制 */

    /* 设置波特率预分频系数 */
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_ADS1256_BAUD;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;    /* 数据位传输次序:高位先传 */
    SPI_InitStructure.SPI_CRCPolynomial = 7;            /* CRC多项式寄存器,复位后为7。本例程不用 */
    SPI_Init(SPI_ADS1256, &SPI_InitStructure);

    SPI_Cmd(SPI_ADS1256, DISABLE);            /* 先禁止SPI  */

    SPI_Cmd(SPI_ADS1256, ENABLE);                /* 使能SPI  */   

#endif
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-5-1 10:49:20 | 显示全部楼层
不清楚这个问题,帮顶。
回复

使用道具 举报

8

主题

20

回帖

44

积分

新手上路

积分
44
 楼主| 发表于 2016-5-1 15:06:04 | 显示全部楼层
解决了,错误在这里,编译居然没有报错。
    GPIO_PinAFConfig(GPIOB, GPIO_Pin_14, GPIO_AF_SPI2);
    GPIO_PinAFConfig(PORT_ADS1256_DIN, PIN_ADS1256_DIN, GPIO_AF_SPI2);
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 01:16 , Processed in 0.039354 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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