我们尝试将 DAC 7565集成到微控制器中、我们在 SPI 通信方面遇到了一个奇怪的问题、伪代码是
static void DacWrite( uint16_t dacChannel, const uint16_t dataToWrite){
uint8_t dacBuffer[3]{0};
HAL_GPIO_WritePin(DAC_ENABLE_GPIO_Port,DAC_ENABLE_Pin,GPIO_PIN_RESET);
uint32_t wrdata = dataToWrite << 4;
dacBuffer[1] = static_cast<uint8_t>((wrdata >> 8) & 0xff);
dacBuffer[2] = static_cast<uint8_t>(wrdata & 0xff);
HAL_GPIO_WritePin(DAC_SYNC_GPIO_Port,DAC_SYNC_Pin,GPIO_PIN_RESET);
DWT_Delay_us(1);
switch (dacChannel) {
case DAC_CHANNEL_A:
dacBuffer[0] = 0x10;
break;
case DAC_CHANNEL_B:
dacBuffer[0] = 0x12;
break;
case DAC_CHANNEL_C:
dacBuffer[0] = 0x14;
break;
case DAC_CHANNEL_D:
dacBuffer[0] = 0x16;
break;
default:
return;
break;
}
HAL_SPI_Transmit(&hspi1, dacBuffer, 3, 10000);
HAL_GPIO_WritePin(DAC_SYNC_GPIO_Port,DAC_SYNC_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(DAC_ENABLE_GPIO_Port,DAC_ENABLE_Pin,GPIO_PIN_SET);
}
//Calling the dac function in a loop as follows:
for(int i =0;i<3000;i+=100){
DacWrite(DAC_CHANNEL_A,i);
DacWrite(DAC_CHANNEL_B,i);
DacWrite(DAC_CHANNEL_C,i);
DacWrite(DAC_CHANNEL_D,i);
DelayMs(2000);
}
我们面临的问题是、使用此代码时、只有 DAC A 更新、DAC C 更新为 DAC A 的值几乎两倍、DAC 中没有输出、DAC B 和 DAC D 从未更新、且它们始终为0。
但是,当代码在每个 DacWrite(.)上设置断点时 所有通道的 DAC 输出都正确。
尝试了其他方法、其中使能引脚始终保持低电平、SYNC 变为低电平/高电平、用于 SPI 通信、结果相同。