【发布时间】:2019-07-18 20:58:40
【问题描述】:
我正在尝试通过光耦合器电平转换器发送 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
【问题讨论】:
-
rx指向哪里?它是未初始化的。buffer是什么?而while feof总是错的。 -
不相关:有机会时给Why is “while (!feof(file))” always wrong?一读
-
您的问题不在于反转位,这是可以高度自信地声称的事情。 minimal reproducible example发布后可以说更多。
-
另请注意,65531 是 无符号 16 位整数,其位模式与带符号的 16 位二进制补码整数相同,值为 -5。
-
示例代码读取(最多)80 个
unsigned shorts,但随后输出第一个 80 次(正负反转),忽略其余部分。
标签: c++ beagleboneblack spi ioctl