我正在尝试编写一个发送16位字并将其存储在另一个变量中的函数。我想要做的是接受这个词,并一次一位地将数据传输(写入)到新变量。
如果可以递归地完成这项工作也会很棒。因此,例如,我有函数SendCommand(uint32_t addr,uint16_t数据),并且在传输了一位之后,可以移位字节,并且可以使用新数据再次调用该函数。
我的问题是:
注意:MSB优先
编辑:
我这样做的原因是因为我正在为接受这些数据的设备编写伪代码。现在在我的代码中,我正在模拟一个时钟,并且为该器件指定的格式会在每个时钟下降沿向寄存器写入一个位。
答案 0 :(得分:2)
在一次通话中写入MSB优先:
void SendCommand(uint32_t addr, uint16_t data) {
volatile unsigned char *dest = (unsigned char *)addr
for(int i=15; i>=0; --i) {
*dest = (data & 0x8000) >> 15;
// ^^^^^^^^ get MSB
// ^^^^^ move the MSB down to the LSB, assuming the
// peripheral wants the bit in the LSB.
data <<=1;
}
} //SendCommand
在多个调用中执行此操作需要以某种方式保持位数。如果没有在某个地方进行计数,您无法判断是否已将每一位都移出左侧,或者您还没有剩下任何1
位。旋转和测试相等性也不起作用,例如0x5555
或其他具有重复位模式的值。