You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现整数转0x格式十六进制字节存入n×2数组用于DAC SPI波形输出

SPI DAC采样值转换实现方案

先明确16位SPI帧格式

寄存器位定义(MSB优先,从高位到低位排列):

  1. 最高4位:固定控制码0x9
  2. 中间10位:DAC输入电平值
  3. 最低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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:15:03