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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!