ADS1118 STM32 SPI驱动(HAL)

硬件平台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;
}

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值