C语言实现整数转0x格式十六进制字节存入n×2数组用于DAC SPI波形输出
SPI DAC采样值转换实现方案
先明确16位SPI帧格式
寄存器位定义(MSB优先,从高位到低位排列):
- 最高4位:固定控制码
0x9- 中间10位:DAC输入电平值
- 最低2位:无效位,默认填0即可
转换逻辑
- 首先对输入的int类型采样值做限幅,确保范围在10位无符号数区间
0~1023,避免溢出 - 将采样值强制转换为16位无符号类型后左移2位,空出最低2位无效位
- 与控制码基值
0x9000做按位或运算,拼接得到完整16位SPI发送帧 - 将16位帧拆分为高8位、低8位两个
unsigned char类型值,按顺序存入预定义数组即可
代码示例(嵌入式C环境)
// 预定义采样数组最大容量,可根据你的需求调整 #define MAX_SAMPLE_CNT 1024 // 每个采样点对应2字节SPI发送数据,数组总长度为2倍采样点数 unsigned char dac_wave_buf[2 * MAX_SAMPLE_CNT] = {0}; // 波形生成for循环示例 void generate_wave_table(int sample_cnt) { // 校验采样点数不超过数组容量 if (sample_cnt > MAX_SAMPLE_CNT) sample_cnt = MAX_SAMPLE_CNT; for (int i = 0; i < sample_cnt; i++) { // 此处替换为你自己的三角波/锯齿波采样值生成逻辑 int sample_val = generate_triangle_sample(i, sample_cnt); // 10位采样值限幅处理 if (sample_val > 1023) sample_val = 1023; if (sample_val < 0) sample_val = 0; // 拼接16位SPI帧 uint16_t spi_frame = 0x9000 | ((uint16_t)sample_val << 2); // 拆分高低字节,高字节在前符合MSB优先发送要求 dac_wave_buf[2 * i] = (unsigned char)(spi_frame >> 8); dac_wave_buf[2 * i + 1] = (unsigned char)(spi_frame & 0xFF); } }
验证说明
- 拼接后的高字节取值范围固定为
0x90~0x9F,完全符合你要求的0x9.格式 - 数组存储顺序与SPI发送顺序完全一致,实际输出时直接按字节顺序发送数组内容即可,无需额外处理
内容的提问来源于stack exchange,提问作者WTFisChris
相关产品推荐
相关产品推荐

