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