如何将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
相关产品推荐
相关产品推荐

