我们尝试将 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 通信、结果相同。