ADS1118 STM32 SPI驱动(HAL)

本文介绍了在STM32平台上使用SPI通信与ADS1118 ADC芯片进行数据交互的过程,包括配置寄存器、设置CPOL和CPHA参数、读取转换数据的步骤。同时,文中提到了由于STM32407VE芯片的缺货和价格飙升,提出了国产MS1112作为替代方案。在错误处理方面,当读写配置不一致时,会进行重新初始化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

硬件平台STM32407VE,2022年这个芯片缺货都涨价到100以上,简直奇葩。

还好有国产替代ms1112(IIC接口)----扯远了

IO配置

CPOL与CPHA设置

根据ADS1118时序得出CPOL=0,CPHA=1

敲黑板了:CPHA=1需要选择2 Edge(很容易出错)

/***************************************************
    0x024B配置为:
    工作在连续转换模式下,AINP 为 AIN0 且 AINN 为 AIN1 
    参考电压为±4.096V,数据采样频率为32Hz,ADS芯片工作在ADC模式下
    使能内部DOUT引脚的上拉电阻,每次数据有效,更新配置寄存器
****************************************************/
uint8_t        ADS_Config[2]={0x02,0x4B};        //ADS1118配置寄存器值

/* USER CODE BEGIN 1 */
uint8_t SPI3_ReadWriteByte(uint8_t TxData)//发送一个字节,并从寄存器返回一个字节
{
    uint8_t Rxdata=0,Tx=0;
    Tx=TxData;
    HAL_SPI_TransmitReceive(&hspi3, &Tx, &Rxdata, 1, 10);    //超时10ms   
     return Rxdata;                      
}
/* USER CODE END 1 */

uint16_t ADS1118_Send_Data(uint8_t MSB,uint8_t LSB)
{
    uint16_t Data;
    uint8_t MSB_Byte,LSB_Byte;
    MSB_Byte=SPI3_ReadWriteByte(MSB);        //配置一次寄存器,同时往回读数据
    LSB_Byte=SPI3_ReadWriteByte(LSB);
    Data=MSB_Byte<<8|LSB_Byte;
    return Data;                //返回读到的数据
}

void ADS1118_Init(void)
{
    HV_CS_High;
    HAL_Delay_us(1000);        //硬件初始化后等1000us
    HV_CS_Low;                    //片选拉低
    ADS1118_Send_Data(ADS_Config[0],ADS_Config[1]);        //初始化之后进行一次配置寄存器
    HV_CS_High;                    //片选拉高

}

32位读取模式

uint16_t Read_ADS_Data(uint8_t MSB,uint8_t LSB,uint16_t *config)
{
    uint16_t ADS_Data;
    

    HAL_Delay_us(2);        //拉低后等待2us
    ADS_Data=ADS1118_Send_Data(MSB,LSB);        //读取一次数据
    *config=ADS1118_Send_Data(MSB,LSB);

    
    return ADS_Data ;        //返回读到的数据
}

uint32_t Read_HV_Vol(void)
{
    uint16_t ADS_Set_config;
    uint32_t Value;
    
        //__disable_irq();        //关总中断
        HV_CS_Low;                //片选拉低
        //读取一次转换数据,并将设置寄存器中的值也读回来
        HV_Raw_AD=Read_ADS_Data(ADS_Config[0],ADS_Config[1],&ADS_Set_config);        
        HV_CS_High;                    //片选拉高
        //__enable_irq();         //开总中断    
    
    ADS_Set_Read[0]=ADS_Set_config>>8;        
    ADS_Set_Read[1]=ADS_Set_config|0x01;
    //比较写进去的与读回来的是不是一样
    if((ADS_Set_Read[0]==ADS_Config[0])&&((ADS_Set_Read[1]==ADS_Config[1])))    
    {                    
        if(HV_Raw_AD<0x8000)    //是正值
            HV_Raw_Vol=(uint32_t)HV_Raw_AD*4096.0*(Theoretical_magnification)/32767.0;    //结果数据是mV
        else            
            HV_Raw_Vol=0;      //负值自己处理
    }
    else
    {
        Relay_Signal_Err_Count++;    
        if(Relay_Signal_Err_Count>5)//如果错误计数
            ADS1118_Init();
    }
    return HV_Raw_Vol;
}

### 使用STM32 HAL库与ADS8860进行接口 为了使STM32微控制器能够通过SPI通信协议与ADS8860模数转换器(ADC)交互,需配置SPI外设并编写相应的初始化和数据传输函数。以下是基于HAL库的实现方法。 #### 初始化SPI外设 在`stm32f4xx_hal_msp.c`文件中定义SPI句柄结构体,并完成低级资源(GPIO, NVIC中断线等)设置: ```c static void MX_SPI1_Init(void) { hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; // 主模式 hspi1.Init.Direction = SPI_DIRECTION_2LINES; // 双向全双工 hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 数据宽度为8位 hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // 时钟极性低电平有效 hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // 第一跳变沿采样 hspi1.Init.NSS = SPI_NSS_SOFT; // 软件管理NSS信号 hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; // 波特率预分频系数 hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // MSB先发送 hspi1.Init.TIMode = SPI_TIMODE_DISABLE; // 禁用TI模式 hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; // CRC校验关闭 hspi1.Init.CRCPolynomial = 7; if (HAL_SPI_Init(&hspi1) != HAL_OK){ Error_Handler(); } } ``` #### 编写读取ADS8860 ADC值的功能函数 创建一个新的`.c`源文件来封装具体的业务逻辑操作,比如下面这个用于获取一次完整的AD转换结果的方法: ```c uint16_t Read_ADS8860_Value(void) { uint8_t txBuffer[2]; /* 发送缓冲区 */ uint8_t rxBuffer[2]; /* 接收缓冲区 */ memset(txBuffer, 0xFF, sizeof(txBuffer)); // 填充命令字节 // 启动单次转换指令 txBuffer[0] = ADS8860_CMD_START_CONVERSION_SINGLE_ENDED; // 执行SPI事务处理过程 if(HAL_SPI_TransmitReceive(&hspi1, txBuffer, rxBuffer, 2, HAL_MAX_DELAY)!= HAL_OK){ return ERROR_VALUE; } // 组合高低字节得到最终的结果 return ((rxBuffer[0]<<8)|rxBuffer[1]) & 0xFFF; } ``` 上述代码片段展示了如何利用HAL库提供的APIs来进行SPI总线上两个设备间的同步通讯[^1]。需要注意的是,在实际应用环境中可能还需要考虑更多的细节问题,例如错误检测机制、超时保护以及针对不同应用场景下的优化措施等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值