|
终于解决了
我试图把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 |
|