STM32 硬件SPI读取HT7036程序(HAL库)

2023-12-27 18:45:06

?由下图HT7036的时序图可以看出,SCK在空闲时是低电平,读数据是从下降沿开始的,则CPOL=0,CPHA=1;高位数据先行。

?SPI配置为主从模式,不使能NSS。

?

?HT7036 写数据格式为1个命令加3个数据,手册中表明特殊命令的高位为1.

?

?先写入地址,再发送3个数据。数据高位先发

void HT7036_Write(uint8_t addr, uint32_t data)
{
	uint8_t TxSend[3]; // 定义3个字节的数据  发完命令紧接着发3个数据
	
	//列如data=0xA48CD5
	TxSend[0]=(data>>16)&0xff;  //先发高位 0xA4
	TxSend[1]=(data>>8)&0xff;		//再发中位 0x8C
	TxSend[2]=(data>>0)&0xff;		//先发低位 0xD5
	
	addr=addr|0x80;  //写特殊命令最高位为1  HT7036中有表明
	
	HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET);// CS=0;
	HAL_SPI_Transmit(&hspi2, &addr, 1, 1000);                         // 发送命令
	
	HAL_SPI_Transmit(&hspi2, TxSend, 3, 1000);                        // 发送3字节数据
	HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET);  // CS=1;
}

初始化时先复位,再校表,设置时钟,开启滤波等

void HT7036_init()
{
	HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET);  // CS=1;
	
	HAL_Delay(1);
	HT7036_Write(0xd3,0x000000);//软件复位;
	HAL_Delay(1);
	HT7036_Write(0xC9,0x00005a);//允许校表
	HAL_Delay(1);
	HT7036_Write(0x01,0x00f97e);//慢速1.76Hz,主频172.8KHz,开启所有电压和电流转换0x00f97e
	HAL_Delay(1);
	HT7036_Write(0x31,0x003527);//开启电流电压滤波
	HAL_Delay(1);
	HT7036_Write(0xC9,0x0000ff);//禁止校表
	HAL_Delay(1);
	HT7036_Write(0xC6,0x0000ff);//只允许读计量寄存器
	HAL_Delay(1);
}

HT7036读数据也是先发一个命令,然后读取三个数据

uint32_t HT7036_Read(uint8_t addr)  // 读   发1+收3
{
	uint8_t ReadData[3];
	uint32_t data;
	
	HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET);// CS=0;
	HAL_SPI_Transmit(&hspi2, &addr, 1, 1000);                // 发送读取命令
	
	HAL_SPI_Receive(&hspi2, ReadData, 3, 1000);              // 接收数据	
	HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET);  // CS=1;
	
	data=ReadData[0]<<16 | ReadData[1]<<8 | ReadData[2];
	return data;
}

主函数中先初始化再按地址读数据

HT7036_init();
while (1)
{
    curr=HT7036_Read(0x0D);
    HAL_Delay(1);
}

文章来源:https://blog.csdn.net/qq_24426625/article/details/135250510
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。