一、简述
HT7512A是一款低功耗、轨到轨输出、12位串行输入数模转换器芯片,它与DAC7512完全兼容。在STM32单片机上的应用,网上可以找到很多例子,就不再赘述了,这里特别讲一下在HC32A4A0单片机上的应用,大致与在STM32单片机上的应用差不多,这里讲一下注意点。
二、SPI配置
根据芯片手册,可以知道,我们需要通过SPI向HT7512A写0~4095的值,芯片对应输出0~5V电压,因为我们只需要写数据,所以只需要配置CS/CLK/MOSI三根线即可,配置如下:
/* SPI引脚配置 */
static void SPI_Config(void)
{
stc_gpio_init_t stcGpioInit;
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_OUT;
(void)GPIO_Init(SPI_SCK_PORT, SPI_SCK_PIN, &stcGpioInit);
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_OUT;
(void)GPIO_Init(SPI_MOSI_PORT, SPI_MOSI_PIN, &stcGpioInit);
GPIO_SetDebugPort(GPIO_PIN_TRST, DISABLE);
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_OUT;
(void)GPIO_Init(SPI_SS0_PORT, SPI_SS0_PIN, &stcGpioInit);
}
注意:
1. MOSI引脚PB4是特殊引脚,它默认NJTRST功能,因此想使用GPIO功能,必须将其失能
GPIO_SetDebugPort(GPIO_PIN_TRST, DISABLE);
这就是加上这一句的原因,这点注意就行了!
2. SPI2片选CS的PA13也是特殊引脚,它默认SWDIO功能,如果使用这个引脚进行片选,那么势必会与SWDIO冲突,将其复用为GPIO功能,会导致单片机无法使用SWDIO方式烧录,硬件设计时注意避免这种情况。
三、SPI时序
首先,HT7512A与单片机是通过SPI进行通讯的,下面看一下芯片手册上的SPI写数据的时序:
我才用的是GPIO模拟SPI写的时序,代码如下:
PS:如果对SPI时序有疑问的,可以详细了解SPI读写时序,这里不再仔细说明。
/* SPI写数据 a输入范围:0~4095 */
void HT7512A_SendData(uint16_t a)
{
int i;
SPI_CS_1;
SPI_CLK_1;
SPI_DATA_1;
DDL_DelayUS(1);
SPI_CS_0;
DDL_DelayUS(1);
for (i = 0; i < 16; i++) {
if (0x8000 & a) {
SPI_DATA_1;
} else {
SPI_DATA_0;
}
DDL_DelayUS(1);
SPI_CLK_0;
a = a << 1;
DDL_DelayUS(1);
SPI_CLK_1;
}
SPI_CS_1;
SPI_CLK_1;
SPI_DATA_1;
}
上面我们提到,我们的目的是让HT7512输出0~5V的电压值,如果精确到0.1V,将输入值扩大10倍进行如下处理即可:
/* value输入范围:0~50 */
void HT7512A_Send_Data(uint8_t value)
{
uint16_t data;
uint8_t temp;
temp = value % 10;
value = value / 10;
data = ((4095 * value) / 5) + (temp * 82);
HT7512A_SendData(data);
}