问题描述
我正在尝试编写一个程序,该程序将通过算术将位转换为某个变量。 该程序适用于 raspberry pi,将利用板载串行外设接口 SCLCK 功能来控制发送位的速度,还将控制位的读取。 换句话说,程序将在一个循环内,该循环将在每个时钟周期运行一次。
我们正在使用的模数转换器将根据以下内容以 MSB 样式发送位:8 位,中断位,8 位,中断位,8 位,总共发送 24 位数据。
然后程序将以相同的速度运行一个循环以在确切的时钟周期读取位,然后在时钟周期获取我们输入的 GPIO 引脚的值,无论是真还是假,这将继续每 27 (24, + 3 个中断) 时钟周期无限循环。 目标是为连接到模数转换器的麦克风的输出接收一个 24 位浮点数,该转换器将向输入发送一个可变电压,进而给出最终的 24 位浮点数。 由于树莓派只支持串行接口,我一次只能接收一位,并且需要能够将它们组合在一起以获得我需要的数字。
我在问是否有可用的方法,在 python 语言中,对变量进行算术移位,以便我可以发送从 GPIO 引脚接收到的位。 我知道这可以在汇编中完成,但我需要有关树莓派 GPIO 引脚地址的所有信息。 这还包括针对特定应用的广泛联网。
关于我如何做到这一点的任何想法?
if GPIO.input(25): #If it is true
#Arithmetic Logic Shift Left a one
else:
#Arithmetic Logic Shift Left a zero –
1楼
问题不是 100% 清楚。 所以我只解释一般原则。
您正在寻找的是算术左移运算符<<
new_bit = 1 if GPIO.input(25) else 0 # ensure new_bit is 1 or 0
result = result << 1 + new_bit # shift result left and add new bit as LSB
在您处理 24 个时钟周期之前, result
会被初始化为result = 0
。
假设 python 没有左移操作符。 算术左移等同于乘以 2。所以你也可以这样写:
new_bit = 1 if GPIO.input(25) else 0 # ensure new_bit is 1 or 0
result = result * 2 + new_bit # shift result left and add new bit as LSB
您不太清楚您希望如何从 GPIO 接收数据。 (如何检测 SCLK 的变化/如何“以相同的速度运行循环以在精确的时钟周期读取位”)
我假设您想通过一些 GPIO 访问一次读取一位,然后将这些位组合成一个整数。 但是您可能会解释如何知道何时从 GPIO 读取下一位。
def get_bit():
# some magic code
value = GPIO.input(25)
# let's assume value is 1 or 0:
bit = 1 if value else 0
return bit
def get_24_bit_value():
result = 0
for _i in range(3):
for _j in range(8):
wait_for_clock_tick() # to be implemeted by you
result = (result << 1) + get_bit()
wait_for_break() # to be implemeted by you
return result