我正在尝试通过光耦合器电平转换器发送SPI数据。 (基本上将3.3v信号转换为5v信号)
在此过程中,电平移位器翻转所有位(反相逻辑),而不是使用另一个反相器来重新对齐信号,我认为将反相位简单地从SPI端口发送会更容易。
为此,我将片选模式设置为高电平有效,并更改了时钟极性。现在,我尝试对发送的数据进行翻转。
unsigned short* tx;
unsigned short* rx;
while(!feof(data_file)){
fread(buffer, 2, 80, data_file);
tx = buffer;
for(int i = 0; i < 80; i++){
(*tx)= ~(*tx); //added this line
spi.transfer((unsigned char*) tx,(unsigned char*) rx, 2);
(*rx)= ~(*rx); //also added this line
printf("0x%04x\n", *rx);
pinControl.selectChip(i%8);
usleep(5);
}
在添加之前,有很好的干净输出
收到的数据:
0x04cb
0x04cb
0x04cb
0x04cb
0x04cb
0x04cb
0x04cb
0x050b
0x050b
0x050b
0x050b
反转后:
0xfd36
0x02c9
0xfd36
0x02c9
0xfd36
0x02c9
0xfd36
0x02c9
0xfd36
0x02c9
0xfd36
0x02c9
0xfd36
0x02c9
请注意,我发送的数据是单调递增的,因此第二个输出不正确。
我的假设是
(* tx)=〜(* tx)
实际上并没有反转位。
因此,我试图检验这一理论。
unsigned short* tx;
unsigned short* rx;
(*tx)=4;
std::cout << *tx << endl;
std::cout << ~(*tx) << endl;
(*tx) = ~(*tx);
std::cout << (*tx);
产量:
4
-5 <-- this is ~4 correct
65531 <-- this is unexpected
最佳答案
两个代码示例中的问题都是指针使用不正确。
您正确地声明了指针,但没有为它们分配有效的内存地址。
例如,当您这样做时:
unsigned short* tx;
(*tx)=4;
tx
包含一些随机地址,因为您没有分配它。因此,当您取消引用它并尝试将4放在下一行时,无法得知这4的实际位置。
tx
中的值可能为0或接近0,您的程序将崩溃(SEGFAULT)。或者,其他一些代码可能正在使用此内存,并且将覆盖该值,这将解释为什么您突然得到65531的原因,尽管它与先前的值无关。
在带有SPI调用的代码示例中,存在两个问题:
您永远不会在循环中超前
tx
指针,因此您总是要反转并发送相同的两个字节。您没有为
rx
指针分配任何有效的内存,因此与测试一样,数据将被随机放置,并且程序可能会随机崩溃。最后,最大的问题是:您如何声明
buffer
?如果以与
rx
和tx
相同的方式声明它,则即使从文件读取也可能无法正常工作。这是应该工作的代码版本:
unsigned short tx;
unsigned short rx;
while(fread(&tx, 2, 1, data_file) > 0) {
tx = ~tx;
spi.transfer(&tx, &rx, 2);
rx = ~rx; //also added this line
printf("0x%04x\n", rx);
pinControl.selectChip(i % 8);
usleep(5);
}
关于c++ - 如何反转存储在存储器地址中的位?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57102540/