您好!
我有 一个 ADS1256 、我想通过 SPI 连接到微控制器 STM32F107RCT6。
我编写了驱动程序、但仍然无法获得正确的转换结果。
首先、我的原理图:
R1-R4是具有 COef 的分压器。 8.
R5-R6和 C1-C3 -抗混叠滤波器。
其他元件符合数据表。
SPI 和 MCU 配置:
和驱动程序代码:
/***********
*文件名 :main.c
*说明 主要方案机构
**本通知适用于此文件
的所有部分*,它们不在注释对 USER CODE BEGIN 和
* USER CODE END 之间。 此文件的其他部分、
无论是*由用户插入还是由软件开发工具
插入*、均归其各自的版权所有者所有。
*
*版权所有(c) 2018 STMicroelectronics
*
*只要
满足以下条件、就允许以源代码和二进制形式重新分发和使用**。
1. 重新分发源代码必须保留上述版权声明
* 此条件列表和以下免责声明。
* 2. 以二进制形式重新分发必须复制上述版权声明
* 本条件列表和文档中的以下免责声明
* 和/或随分发提供的其他材料。
* 3. STMicroelectronics 的名称及其贡献者的名称
*都不是 可用于认可或推广从本软件派生的产品
* 未经特定的事先书面许可。
*
*本软件由版权所有者和贡献者"按原样"提供
*、*不
承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证。 在任何情况下、版权持有人或贡献者
都不对任何直接、间接、偶然、特殊、模范、
或相应的*损害(包括但不限于采购替代产品或
*服务;丧失使用、数据或利润; 但是
*由于
使用
本软件*而以任何方式产生的任何责任理论(无论是合同、严格责任、*或侵权行为(包括疏忽或其他))、即使被告知可能会造成此类损害。
*
*
*/*
包括:------------------------------------------------------- */
#include "main.h"
#include "stm32f1xx_hal.h"
#include "stdio.h"
//用户代码 begin 包括*/
#define CS_ON ()HAL_GPIO_WritePin (CS_GPIO_Port、CS_Pin、GPIO_RESET)//启用
PIN #CS CS_OFF (CS_Pin)---
和 CS_PRIVE---
*/
SPI_HandleTypeDef hspi3;
/*用户代码 begin PV */
/* private 变量------------------------------------------------------- /uint8_t
spiTxBuf[10],spiRxBuf[3];//发送和接收缓冲区
int32_t 结果;//转换结果变量
//用户代码末尾 PV */*
私有函数原型--------- /void
SystemClock_Config (void);
static void MX_GPIO_Init (void);
static void MX_SPI3_Init (void);
/*用户代码 begin PFP *//*
私有函数原型--- /*
用户代码末尾 PFP */*
用户代码开始0 */*
用户代码结束0 */
int main (void)
{/*
用户代码开始1 */*
用户代码结束1 */*/* MCU
配置------ //
//*复位所有外设,初始化闪存接口和 SysTick。 */
HAL_Init();
//用户代码 begin Init */
//*用户代码 end Init */
//*配置系统时钟*/
SystemClock_Config();
//*用户代码 begin sysinit */
//*用户代码 end sysinit *//
////*初始化所有已配置的外设*/
mx_GPIO_Init
();mx_SPI3*
/ userInit *
CS_ON();//启用 CS
spiTxBuf[0]= 0xFE;//设置复位命令地址
HAL_SPI_transmit (&hspi3、spiTxBuf、1、50);//通过 SPI 发送缓冲器
CS_OFF ();//禁用 CS
CS_ON();//启用 CS
spiTxBuf[0]= 0x0F;//设置 SDATAC 命令地址
HAL_SPI_transmit (&hspi3、spiTxBuf、1、50);//通过 SPI 发送缓冲器
CS_OFF ();//禁用 CS
CS_ON();//启用 CS
spiTxBuf[0]= 0x50;//设置 WREG 命令地址+状态寄存器的地址
HAL_SPI_transmit (&hspi3、spiTxBuf、1、50);//通过 SPI 发送缓冲器
spiTxBuf[0]=3;//设置要写入的寄存器数量
HAL_SPI_transmit (&hspi3、spiTxBuf、1、50);//通过 SPI 发送缓冲器
spiTxBuf[0]= 0x00;//状态- MSB;禁用自动校准;禁用缓冲器;DRDY
spiTxBuf[1]=0x01;// MUX - AIN0为正、AIN1为负
spiTxBuf[2]=0x00;// ADCON -时钟输出禁用;传感器检测禁用;PGA = 1
spiTxBuf[3]=0xF0;// DRATE - 30000 SPS
HAL_SPI_transmit (&hspi3、spiTxBuf、4、50);//通过 SPI 发送缓冲器
cs_off();//禁用 CS
/*用户代码 end 2 */
/* Infinite loop */
*用户代码在*/
while (1)
{
//
*/*用户代码 end while *///*用户代码 begin 3 */ CS_on ();//启用 CS spiTxBuf[0]= 0xFC;//设置命令地址 sync_50
、spi1、tf_spi1、transmit spi_spi_pixBuf (1) //通过 SPI
CS_OFF ()发送缓冲器;//禁用 CS
CS_ON ();//启用 CS
spiTxBuf[0]= 0x00;//设置唤醒命令地址
HAL_SPI_transmit (&hspi3、spiTxBuf、1、50);
CS_OFF (); //禁用 CS
CS_ON ();//启用 CS
spiTxBuf[0]=0x01;//设置 RDATA 命令地址
HAL_SPI_transmit (&hspi3、spiTxBuf、1、50);//通过 SPI
HAL_delay (1)发送缓冲区;//延迟1ms
HAL_SPI_receive (&hspi3
;SPIxBuf
= 0
结果;// SPIxBuf = 0;//结果= 0 = 0;SPIxCs = 0 = 0;SPi_receive
结果= spiRxBuf[1];
结果=结果<< 8;
结果= spiRxBuf[2];
HAL_delay (100);
}
//*用户代码结束3 *
}
//}//**系统时钟配置
*/
void SystemClock_Config (void)
{
RCC_OscInitTypeDef RCC_InitStruct;
RCC_OscitClk_Struct; RCC_OscitTrulkClt;
/**初始化 CPU、AHB 和 APB 总线时钟
RCC_OscInitStruct.OscatorType
= RCC_OSCILLStruct_HSE;RCC_OscInitStruct.HSEState
= RCC_HSE_ON;RCC_OscInitSStruct.HSEPreDIVValue
= RCC_HSE_OsciviV_DIV5;
RCC_PREDIV_RCC_RDIV1
;RCC_RDIV_RDIV_RDIV1;RCC_RDIVITSource_RDIV1 = RCC_RDIVIT_RDIVIT_RDIVIT_RDIV_RDIVIT_RDIVIT_RDIV_RIC_RIC_
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscitStruct.PLLLMUL = RCC_PLL_MUL9;RCC_PLL2_RPLL2.ON
= RCC_PLL2.PLL2.PLL2.PLL2.ON;RCC_RCC_PLL2.PLL2.PLL2.PLL2.ON = RCC_RIC_PLLT_PLL2.ON
RCC_OscInitStruct.PLL2.HSEPrediv2Value = RCC_HSE_PREDIV2_DIV5;
IF (HAL_RCC_OscConfig (&RCC_OscInitStructt)!= HAL_OK)
{
_Error_Handler (__file__、__line__);
}
/**初始化 CPU、AHB 和 APB 总线时钟
//
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKd = RCC_SYSCLCD_CLKDIV1
;RCC_CLKCLKCLKCLKDIV1 = RCC_CLKCLK1;RCC_CLKCLKCLKCLKCLKCLKCLKDIVDD_CLK_CLKCLK_CLKCLK_CLKCLKCLK_CLK_CLKCLK_CLK_CLK_CLKDIVDD.CLK_CLK_CLK_CLKCLK
if (HAL_RCC_ClockConfig (&RCC_ClkInitStruct, flash_latit_2)!= HAL_OK)
{
_Error_Handler (__file__、__line__);
}
/**配置 SysTick 中断时间
*/
HAL_SysTK_Config (HAL_RCC_GetHCLKFreq ()/1000);
/**配置 SysTick
*/
HAL_SysTK_CLKSourceConfig (SysTK_CLKSOURCE_HCLK);
/**配置 SysTick 中断时间
*/
_ HAL_RCC_PLLI2S_ENABLE ();
* SysTick _IRQn 中断配置*/
HAL_NVIC_setPriority (SysTick _IRQn、0、0);
}
// SPI3 init 函数*
静态空 MX_SPI3_Init (void)
{
*/* SPI3参数配置*、SPI3、SPI3_Inspiarity
= spi3;spi3 Inspi3;spi_inspi3 inspi3 inspi3;spi3 inspi3 inspi_spi3 inspi3 inspi3 inspi3 inspi3 inspi3;spi3 inspi3 inspi_spi3 inspi3 inspi3 inspi3 inspi_spi3
hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi3.Init.NSS = SPI_NSS_Soft;
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
hspi3.Init.FirstBit = SPI_FIRSTBIT_BADDRESCAST_32;
禁用 TITMDS_InTIDT_TIMESCAST_32;hTITMDSBIT = SPI_InTIDT_DIT3_InTIDE.InTDITIDT_DITDIT
hspi3.Init.CRCCalacimal = SPI_CRCCALLion_disable;
hspi3.Init.CRCPolynomial = 10;
if (HAL_SPI_Init (&hspi3)!= HAL_OK)
{
_Error_Handler (__file__、__line__);
}
//**
将引脚配置为
*模拟
*输入
*输出
* EVENT_OUT
* EXTI
*/
static void MX_GPIO_Init (void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// GPIO 端口时钟启用*/
_ HAL_RCC_GPIOD_CLK_ENABLE();
_ HAL_RCC_GPIO_ENABLE_GPIO_PIN_TRUTE_GPIO_ENABLE_GPIO_TRUTE_PIN_PIN_GPIO_ENTRUTE_GPIO_ENTRUTE_GPIO_PIN_GPIO_ENTRUTRIP_PIN_GPIO_ENTRIP_PIN_GPIO_ENTRIP_PIN_GPIO_ENTRIP_PIN_PIN_PIN_GPIO_ENABLE_GPIO_ENTRIP_PIN_GPIO_ENTRIP_PIN_PIN_GPIO_ENTRIP_GPIO_ENTRIP_PIN_GPIO_ENTRIP_PIN_PIN_PIN_GPIO_ENTRIP_PIN_PIN_PIN_PIN_GPIO_ENTRIP_PIN_PIN_PIN_PIN_GPIO_ENTRIP_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
@brief 在发生错误时执行此函数。
*@param None
*@retval None
*/
void _Error_Handler (char * file、int 行)
{
//*用户代码 begin Error_Handler_debug */
////*用户可以添加自己的实现来报告 HAL 错误返回状态*/
while (1)
{
}
//////*用户代码 end Error_Handler_debug */
}
#ifdef use_full_assert
//
*@brief 报告源文件的名称和源代码行号
* 发生了 assert_param 错误的位置。
*@param 文件:指向源文件名的指针
*@param 行:assert_param 错误行源代码*
@retval 无
*/
void assert_failed (uint8_t*文件、uint32_t 行)
{
//*用户代码 begin 6 *
////*用户可以添加自己的实现来报告文件名和行号,
示例:printf ("错误的参数值:第%d\r\n"行上的文件%s、文件、行)*/
*用户代码结束6 */
}
#endif
//*
@}
*/
*
@}
*/*}*/
/******** (c)版权所有 STMicroelectronics ***** 文件末尾****/
HAL_SPI_Transmit 的代码:
/** *@brief 在阻塞模式下发送大量数据 *@param hspi:指向包含 *的 SPI_HandleTypeDef 结构的指针 SPI 模块的配置信息。 *@param pData:指向数据缓冲区的指针 *@param 大小:要发送的数据量 *@param 超时:超时持续时间 *@retval HAL 状态 */ HAL_StatusTypeDef HAL_SPI_Transmit (SPI_HandleTypeDef * hspi、uint8_t * pData、uint16_t Size、Uint32_spi_t = hspi_state_transmit *(SPI_Handle_t = hspi * hspi * hspi)* hspi_t timeout = pData if ((pData =NULL)||(size ==0)) { 返回 HAL_ERROR; } /*检查参数*/ ASSERT_param (is_SPI_DIRECTIONAL_2LINES_OR_1LINE (hspi->Init.DIRECTION)); /*进程锁定*/ _HAL_LOCK (hspi); /*配置通信*/ hspi->State = HAL_SPI_State_Busy_TX; hspi->ErrorCode = HAL_SPI_ERROR_NONE; hspi->pTxBuffPtr = pData; hspi->TxXferSize =大小; hspi->TxXferCount =大小; /*Init 字段不用于句柄为零*/ hspi->TxISR = 0; hspi->RxISR = 0; hspi->pRxBuffPtr =空; hspi->RxXferSize = 0; hspi->RxXferCount = 0; /*重置 CRC 计算*/ if (hspi->Init.CRCalcanc= SPI_CRCALLion_ENABLE) { SPI_RESET_CRC (hspi); } if (hspi->Init.direction = SPI_DIRECT_1LINE) { /*配置通信方向:1行*/ SPI_1LINE_TX (hspi); } /*检查 SPI 是否已启用*/ if ((hspi->instance->CR1 &SPI_CR1_SPE)!= SPI_CR1_SPE) { /*启用 SPI 外设*/ _HAL_SPI_ENABLE (hspi); } /*以8位模式发送数据*/ if (hspi->Init.DataSize =SPI_DATASIZE _8bit) { if (((hspi->Init.Mode = SPI_MODE_SLAVE)||(hspi->TxXferCount = 0x01)) { hspi->instance->DR =(*hspi->pTxBuffPtr++); hspi->TxXferCount--; } while (hspi->TxXferCount >0) { /*等待 TXE 标志设置为发送数据*/ if (SPI_WaitOnFlagUntilTimeout (hspi、SPI_FLAG_TXE、复位、超时)!= HAL_OK) { 返回 HAL_TIMEOUT; } hspi->instance->DR =(*hspi->pTxBuffPtr++); hspi->TxXferCount--; } /*启用 CRC 传输*/ if (hspi->Init.CRCalcanc= SPI_CRCALLion_ENABLE) { SET_BIT (hspi->实例->CR1、SPI_CR1_CRCNEXT); } } /*以16位模式发送数据*/ 其他 { if (((hspi->Init.Mode = SPI_MODE_SLAVE)||(hspi->TxXferCount = 0x01)) { hspi->instance->DR =*((uint16_t*) hspi->pTxBuffPtr); hspi->pTxBuffPtR+=2; hspi->TxXferCount--; } while (hspi->TxXferCount >0) { /*等待 TXE 标志设置为发送数据*/ if (SPI_WaitOnFlagUntilTimeout (hspi、SPI_FLAG_TXE、复位、超时)!= HAL_OK) { 返回 HAL_TIMEOUT; } hspi->instance->DR =*((uint16_t*) hspi->pTxBuffPtr); hspi->pTxBuffPtR+=2; hspi->TxXferCount--; } /*启用 CRC 传输*/ if (hspi->Init.CRCalcanc= SPI_CRCALLion_ENABLE) { SET_BIT (hspi->实例->CR1、SPI_CR1_CRCNEXT); } } /*等待 TXE 标志设置为发送数据*/ if (SPI_WaitOnFlagUntilTimeout (hspi、SPI_FLAG_TXE、复位、超时)!= HAL_OK) { SET_BIT (hspi->ErrorCode、HAL_SPI_ERROR_FLAG); 返回 HAL_TIMEOUT; } /*在禁用 SPI 之前等待 BUSY 标志被复位*/ if (SPI_WaitOnFlagUntilTimeout (hspi、SPI_FLAG_BSY、设置、超时)!= HAL_OK) { SET_BIT (hspi->ErrorCode、HAL_SPI_ERROR_FLAG); 返回 HAL_TIMEOUT; } /*在2线通信模式下清除超频标志,因为接收到的信号不是读取的*/ if (hspi->Init.direction = SPI_DIRECT_2LINE) { _HAL_SPI_CLEAR_OVRFLAG (hspi); } hspi->State = HAL_SPI_State_ready; /*进程解锁*/ _HAL_UNLOCK (hspi); 返回 HAL_OK; } 否则 { 返回 HAL_BUSY; } }
HAL_SPI_Receive 代码:
/**
*@brief 在阻塞模式下接收大量数据。
*@param hspi:指向包含
*的 SPI_HandleTypeDef 结构的指针 SPI 模块的配置信息。
*@param pData:指向数据缓冲区的指针
*@param size:要接收的数据量
*@param Timeout:超时持续时间
*@retval HAL status
*/
HAL_StatusTypeDef HAL_SPI_Receive (SPI_HandleTypeDef * hspi、uint8_t * pData、uint16_t size、Uint32_t
if)
= uint_t pio_t timeout (spi_t)
#endif /* use_spi_crc */
uint32_t tickstart = 0U;
HAL_StatusTypeDef 错误代码= HAL_OK;
if ((hspi->Init.Mode = SPI_MODE_MASTER)&(hspi->Init.Direction = SPI_Direction_2LINES)
){
hspi->State = HAL_SPI_State_Busy_RX;
/*调用发送/接收函数,在 Tx 线路上发送虚拟数据并在 CLK 线路上生成时钟*/
返回 HAL_SPI_TransmitReceive (hspi、pData、pData、size、Timeout);
}
//*进程锁定*/
_ HAL_LOCK (hspi);
//用于超时管理的初始化
*/ tickstart = HAL_GetTick();
if (hspi-> State!= HAL_SPI_State_ready
)
错误代码= HAL_BUSY;
转至错误;
}
if ((pData == NULL)||(size == 0U)
){
错误代码= HAL_ERROR;
转至错误;
}/*
设置事务信息*/
hspi->状态 = HAL_SPI_State_Busy_RX;
hspi->ErrorCode = HAL_SPI_ERROR_none;
hspi->pRxBuffPtr =(uint8_t *) pData;
hspi->RxXferSize = size;
hspi->RxXferCount = size;
/ISR Init 字段未在 Txdx 中使用;nrxdrxux = 0ux 0ux 0ux = t;t = nrxdrxnrxnrxferSize = 0ux 0ux 0ux (0ux
=空;
hspi->TxISR =空;
#if (USE_SPI_CRC!= 0U)
//重置 CRC 计算*/
if (hspi->Init.CRCalculation =SPI_CRCALLion_enable)
{
SPI_RESET_CRC (hspi);
/*完成此操作是为了在最新数据之前处理 CRCNEXT */
hspi->RxXferCount->;
}
#endif /* USE_SPI_CRC */
//配置通信方向:1Line */
if (hspi->Init.Direction =SPI_Direction_1LINE)
{
SPI_1LINE_RX (hspi);
}
//检查 SPI 是否已启用*/
if ((hspi->instance->CR1 & SPI_CR1_SPE)!= SPI_CR1_SPE)
{
/*启用 SPI 外设*/
_HAL_SPI_ENABLE (hspi);
}
/*以8位模式接收数据*/
if (hspi->Init.DataSize =SPI_DATASIZE _8bit)
{
/*传输循环*/
while (hspi->RxXferCount >0U)
{
/*检查 RXNE 标志*/
if (__HAL_SPI_GET_flag (hspi、SPI_FLAG_RXNE))
{
/*读取接收到的数据*/
(*(uint8_t *) pData)=*(_io uint8_t *)&hspi->instance->DR;
pData += sizeof (uint8_t);
hspi->RxXferCount--;
}
其他
{
/*超时管理*/
if ((Timeout =0U)||((Timeout !=HAL_MAX_DELAY)&&((HAL_GetTick ()-tickstart)>= Timeout)))
{
错误代码= HAL_TIMEOUT;
转至错误;
}
}
}
否则
{
/*传输循环*/
while (hspi->RxXferCount >0U)
{
/*检查 RXNE 标志*/
if (__HAL_SPI_GET_flag (hspi、SPI_FLAG_RXNE))
{
*((uint16_t*)pData)=hspi->instance->DR;
pData += sizeof (uint16_t);
hspi->RxXferCount--;
}
其他
{
/*超时管理*/
if ((Timeout =0U)||((Timeout !=HAL_MAX_DELAY)&&((HAL_GetTick ()-tickstart)>= Timeout)))
{
错误代码= HAL_TIMEOUT;
转至错误;
}
}
}
#if (USE_SPI_CRC!= 0U)
//
if (hspi->Init.CRCalcinc== SPI_CRCALLion_enable)
{
/*在最新数据之前冻结 CRC */
SET_BIT (hspi->instance->CR1、SPI_CR1_CRCNEXT);
/*读取最新数据*/
if (SPI_WaitFlagStateUtilTimeout (hspi、SPI_FLAG_RXNE、设置、超时、tickstart)!= HAL_OK)
{
/*尚未收到最新数据*/
错误代码= HAL_TIMEOUT;
转至错误;
}
/*在16位模式下接收最后一个数据*/
if (hspi->Init.DataSize =SPI_DATASIZE _16BIT)
{
*((uint16_t*)pData)=hspi->instance->DR;
}
/*在8位模式下接收最后一个数据*/
其他
{
(*(uint8_t *) pData)=*(_io uint8_t *)&hspi->instance->DR;
}
/*等待 CRC 数据*/
if (SPI_WaitFlagStateUtilTimeout (hspi、SPI_FLAG_RXNE、设置、超时、tickstart)!= HAL_OK)
{
SET_BIT (hspi->ErrorCode、HAL_SPI_ERROR_CRC);
错误代码= HAL_TIMEOUT;
转至错误;
}
/*读取 CRC 以刷新 DR 和 RXNE 标志*/
tmpreg=hspi->实例->DR;
/*以避免 GCC 警告*/
未使用(tmpreg);
}
#endif /* use_spi_crc */
/*检查事务的结束*/
if ((hspi->Init.Mode == spi_mode_master)&&((hspi->Init.Direction =SPI_Direction_1LINE)||(hspi->Inons_direction =spi_RXONES=2)
/*禁用 SPI 外设*/
_HAL_SPI_DISABLE (hspi);
}
#if (USE_SPI_CRC!= 0U)
/*检查是否发生 CRC 错误*/
if (__HAL_SPI_GET_flag (hspi、SPI_FLAG_CRCR)!=复位)
{
/*检查 CRC 错误是否有效(要应用或不应用解决方法)*/
if (SPI_ISCRCErrorValid (hspi)== SPI_VALIDE_CRC_ERROR)
{
SET_BIT (hspi->ErrorCode、HAL_SPI_ERROR_CRC);
/*重置 CRC 计算*/
SPI_RESET_CRC (hspi);
}
其他
{
_HAL_SPI_CLEAR_CRCERRFLAG (hspi);
}
}
#endif //
if (hspi->ErrorCode!= HAL_SPI_ERROR_NONE)
{
错误代码= HAL_ERROR;
}
错误:
hspi->State = HAL_SPI_State_ready;
__HAL_UNLOCK (hspi);
返回错误代码;
}
因此、变量结果等于0、或显示随机变化的值。
我出了什么问题?

