声明
本实验使用的是某宝的集成板子。(懒得自己焊接调试)
SPI通信
接口说明: 下表为stm32引脚与集成DAC8563板子的引脚连接图
stm32 | DAC8563 |
---|---|
+5V | V+ |
GND | GND |
NSS(片选引脚,随便找一个GPIO输出) | SYN |
SCK | SCK |
MOSI | DIN |
由于DAC8563只可以写入不能读取,所以除了VCC和GND,只需三根线即可进行通信。
SPI通信时序图:
使用HAL库编程这里我们主要关注以下几个参数指标:
- 串行时钟频率:最大为50MHz
- t4:片选信号高电平最小的持续时间为80ns
控制指令
DAC8563一次可接收24位数据,22~23位不使用默认为0,19 ~ 21位为控制位,16 ~ 18位为地址位,0 ~ 15位为数据位。
0x180001: 向A通道输入数据0x0001
0x190001:向B通道输入数据0x0001
0x280001:复位所有寄存器
0x200003:通道A和通道B上电
电压计算公式
HAL库代码
void dac8563config(uint8_t opcode_address, uint16_t config_reg_data) //配置寄存器
{
uint8_t temp[3];
temp[0] = opcode_address;
temp[1] = (uint8_t) ((config_reg_data)>>8);
temp[2] = (uint8_t) (config_reg_data);
HAL_GPIO_WritePin(GPIOC,nss_dac_Pin,GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi2,temp,3,0xffff);
HAL_GPIO_WritePin(GPIOC,nss_dac_Pin,GPIO_PIN_SET);
HAL_Delay(1);
}
void wr_dac_x(uint16_t data) //向通道X写入16位数据并更新
{
uint8_t temp[3];
temp[0] = 0x18;
temp[1] = (uint8_t) (data >> 8);
temp[2] = (uint8_t) data;
HAL_GPIO_WritePin(GPIOC,nss_dac_Pin,GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi2,temp,3,0xffff);
HAL_GPIO_WritePin(GPIOC,nss_dac_Pin,GPIO_PIN_SET);
}
void wr_dac_y(uint16_t data) //向通道Y写入16位数据并更新
{
uint8_t temp[3];
temp[0] = 0x19;
temp[1] = (uint8_t) (data >> 8);
temp[2] = (uint8_t) data;
HAL_GPIO_WritePin(GPIOC,nss_dac_Pin,GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi2,temp,3,0xffff);
HAL_GPIO_WritePin(GPIOC,nss_dac_Pin,GPIO_PIN_SET);
}
void dac_config(void) //配置寄存器汇总
{
dac8563config(0x28,0x0001); //软件复位
dac8563config(0x20,0x0003); //两通道上电
dac8563config(0x38,0x0001); //使用内部参考电压设置增益为2
dac8563config(0x18,0x0000); //向通道x写入数据0x0000并更新
dac8563config(0x19,0x0010); //向通道y写入数据0x0010并更新
}
int main()
{
dac_config(void);
wr_dac_x(1);
wr_dac_y(1);
}