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

如何将2个uint8_t字节数组转换为uint16_t字后通过SPI端口发送

代码问题修复方案

你的代码存在以下明确错误:

  • 变量名拼写错误:定义的非零标记变量是NZero,但循环统计时用了nonZero,导致最终BLANK引脚控制逻辑完全失效
  • 未初始化变量:timeout没有赋初始值就直接做递增判断,初始值随机,超时检测逻辑不可靠;value变量全程没有赋值就传给SPI发送接口,发出的都是随机值
  • 未定义变量:代码中出现了没有声明的valr变量,虽然能编译过但实际运行逻辑完全混乱
  • 逻辑不符合需求:你要把8个单比特状态的Signal数组合成字节、再拼接为16位字发送,不需要手动拆bit循环发送,SPI外设本身支持直接按字节/半字发送,完全可以先拼好数据再调用发送接口
  • SPI操作顺序错误:应该先等待TXE为空再往发送寄存器写数据,你现在是先写数据再等TXE,逻辑反了

修正后可用代码

void senddata(void){
    uint8_t NZero = 0;
    uint16_t timeout = 0; // 初始化超时变量
    uint16_t send_val = 0; // 最终要发送的16位数据
    volatile uint8_t Signal[8]={RGB_NC_0, RGB_1, RGB_2, RGB_3, RGB_4, RGB_5, RGB_6, RGB_NC_7}; 

    // 拼接第一个Signal数组的8个bit为低8位
    for(int i=0;i<8;i++){
        NZero |= Signal[i];
        if(Signal[i]){
            send_val |= (1 << (7 - i)); // 按移位寄存器要求的位序拼接,可自行调整偏移
        }
    }
    // 如果有第二个Signal[8]数组,取消下面注释拼到高8位即可
    /*
    for(int i=0;i<8;i++){
        NZero |= Signal2[i];
        if(Signal2[i]){
            send_val |= (1 << (15 - i));
        }
    }
    */

    //Set LATCH low
    GPIO_WriteBit(LED_LATCH_PORT, LED_LATCH, Bit_RESET);
    //Set blank high
    GPIO_WriteBit(LED_BLANK_PORT, LED_BLANK, Bit_SET);
    //Enable SPI
    SPI_Cmd(LED_SPI, ENABLE);
    
    // SPI配置为16位帧格式时用该发送逻辑
    timeout = 0;
    while(SPI_I2S_GetFlagStatus(LED_SPI, SPI_I2S_FLAG_TXE) == 0 && timeout < 0xFFFF) { 
        timeout++; 
    }
    if(timeout != 0xFFFF){
        SPI_I2S_SendData(LED_SPI, send_val);
    }

    // SPI配置为8位帧格式时,注释上面的发送逻辑,启用下面的逻辑
    /*
    // 先发高字节
    timeout = 0;
    while(SPI_I2S_GetFlagStatus(LED_SPI, SPI_I2S_FLAG_TXE) == 0 && timeout < 0xFFFF) { timeout++; }
    if(timeout != 0xFFFF) SPI_I2S_SendData(LED_SPI, (send_val >> 8) & 0xFF);
    // 再发低字节
    timeout = 0;
    while(SPI_I2S_GetFlagStatus(LED_SPI, SPI_I2S_FLAG_TXE) == 0 && timeout < 0xFFFF) { timeout++; }
    if(timeout != 0xFFFF) SPI_I2S_SendData(LED_SPI, send_val & 0xFF);
    */

    // 等待所有数据发送完成再操作IO
    timeout = 0;
    while(SPI_I2S_GetFlagStatus(LED_SPI, SPI_I2S_FLAG_BSY) == 1 && timeout < 0xFFFF) { 
        timeout++; 
    }

    SPI_Cmd(LED_SPI, DISABLE); 
        
    GPIO_WriteBit(LED_LATCH_PORT, LED_LATCH, Bit_SET);
    if(NZero){
        GPIO_WriteBit(LED_BLANK_PORT, LED_BLANK, Bit_RESET);
    }
    else{
        GPIO_WriteBit(LED_BLANK_PORT, LED_BLANK, Bit_SET);
    }
}

内容的提问来源于stack exchange,提问作者Ahmed Fradi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:15:04