circuitpython数据描述符类,用于表示i2c和spi设备上的硬件寄存器。

adafruit-circuitpython-register的Python项目详细描述


简介图片::https://readthedocs.org/projects/adafruit-micropython-register/badge/?version=latest
:目标:https://circuitpython.readthedocs.io/projects/register/en/latest/
:alt:文档状态

…图片::https://img.shields.io/discord/327254708534116352.svg
:目标:https://discord.gg/nbqh6qu
:alt:discord

图片::https://travis-ci.com/adafruit/adafruit_circuitpython_register.svg?branch=master
:target:https://travis ci.com/adafruit/adafruit_circuitpython_register
:a lt:build status


这个库为'adafruit
circuitpython<;https://github.com/adafruit/circuitpython>;``提供了各种数据描述符类,这使得它真正地
sim请为基于I2C和SPI寄存器的设备编写设备驱动程序。数据
描述符就像来自外部的基本属性,因此使用它们非常容易。


dependencies
circuitpython文件系统上提供了encies。
这可以通过下载
` adafruit库和驱动程序包<;https://github.com/adafruit/adafruit\circuitpython\u bundle>;``来轻松实现。


使用示例
==

-

使用寄存器库创建驱动程序非常简单。首先,从'available modules<;adafruit/register/index.html>;``导入所需的
注册表模块:

。代码块::python

from adafruit_register import i2c_bit
from adafruit_bus_device import i2c_device


接下来,定义位在设备的内存映射中的位置:

。代码块::python

class helloworldevice:
"当‘hello’和‘world’被点亮时,用两位控制的设备。""


hello=i2c位.rwbit(0x0,0x0)
"指示hello是否被点亮的位。""

world=i2c位.rwbit(0x1,0x0)
"指示世界是否亮起的位。"

最后,我们需要添加一个"i2c设备"成员,其类型为:类:`~adafruit总线设备.i2c设备.i2c设备`
,用于为我们管理共享i2c总线。请确保名称准确,否则
寄存器将找不到它。另外,确保i2c设备实现了"busio.i2c"接口。代码块::python

def\u init(self,i2c,device\u address=0x0):
self.i2c\u device=i2c\u device.i2c device(i2c,device\u address)

就是这样!现在我们有一个类可以用来和那些寄存器对话:

…代码块::python


import busio
from board import*


添加一个新的寄存器类型稍微复杂一些,因为您需要小心并最小化类将占用的内存量。如果不这样做,
那么一个有五个您类型寄存器的驱动程序可能会占用5倍的额外内存。


首先,确定新的寄存器类是否应该放在现有模块中。如果有疑问,请选择新模块。模块的粒度越细,需要加载的额外类就越少。


代码块::python

"
可读写的单位寄存器。

"register\u address"处的字节"
def_u init_uu(self,register_address,bit):
self.bit_mask=1<;<;bit
self.buffer=bytearray(2)
self.buffer[0]=register_address

首先要编写一个rst格式的类注释,解释register类的
功能和任何要求。寄存器布局的。
它还记录传递到构造函数(```````初始化````)的参数,构造函数
在设备映射中配置寄存器位置。它不包括
设备地址或i2c对象,因为它在设备类实例
上共享。这样,如果同一总线上有多个相同的设备,那么
寄存器类将被共享。

记住,这会乘以驱动程序中这类寄存器的
个数!这就是为什么我们将
寄存器地址和数据字节打包成一个bytearray。我们可以使用大小为1的两字节数组
,但由于垃圾收集器的存在,每个micropython对象的最小值为16字节。因此,通过共享一个字节数组,我们将其保持在16字节的最小值,而不是32字节的
。每个"memoryView"最少也需要16个字节,因此我们也避免使用它们。

我们可以做的另一件事是,仅在需要时才分配"bytearray"。这个
的优点是预先占用更少的内存,但分配它的成本
每次访问都会有失败的风险。如果要添加一个"foo"版本,该版本会延迟分配底层缓冲区,请将其称为"傻瓜"。

ok,继续。要生成"数据描述符"<;https://docs.python.org/3/howto/descriptor.html>;` ` `
,我们必须实现` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `代码块::python


def\u get(self,obj,objj,objtype=none):
def\u(self,objobj,objobj.i2cu设备写(self.buffer,end=1,stop=false)
obj.i2cu设备读入(self.buffer,start=1)
return bool(self.buffer[1]&;self.bit.掩码)



def\u set(self,obj,obj,value值,obj,值,self,obj,self):
对于obj.i2c_设备:
obj.i2c_设备.write(self.buffer,end=1,stop=false)
obj.i2c_设备.readinto(self.buffer,start=1)
如果值:
self.buffer[1]=self.bit_mask
否则:
self.buffer[1]&;=~ self.bit_mask
obj.i2c设备.write(self.buffer)

首先,``self``存储在设备内存映射中定位寄存器的
寄存器类成员。
其次,``obj``是使用寄存器类的驱动程序类,该类必须通过
定义提供一个:类:`~adafruit`~bus`~device.i2c`device.i2cdevice`兼容的
对象为``i2c`device`。这个对象为我们做了两件事:

1。等待总线释放,在使用时锁定它,然后释放它。
2.保存设备地址和其他设置,这样就不必了。

现在您可以像上面的例子一样使用新的register类。只需记住尽量减少成员的数量,因为这个类可能要使用很多次。






欢迎贡献!请阅读我们的"行为准则
<;https://github.com/adafruit/adafruit_circuitphon_register/blob/master/code_conduct.md>;`\u
帮助该项目保持受欢迎之前。

tps://github.com/adafruit/circuitpython构建工具>;``包。

…代码块::shell

python3-m venv.env
source.env/bin/activate
pip install circuitpython编译工具

代码块::shell

source.env/bin/activate


,然后运行生成:

。代码块::shell

circuitpython构建包——文件名前缀adafruit circuitpython register——库位置。

----

安装依赖项(请随意重用上面的虚拟环境):

…代码块::shell

source.env/bin/activate
pip安装sphinx sphinx rtd主题

代码块:shell

cd docs
sphinx build-e-w-b html。_ build/html

这将把文档输出到"docs/u build/html"。在浏览器中打开index.html以查看它们。它还将(由于-w)错误的任何警告,像特拉维斯将。这是
本地验证它是否通过的好方法。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java实现双锁并发队列   java如何更改SpringWS 2.4.4版或更高版本中maxOccurs的默认限制?   java Selenium RC如何处理动态行?   java何时引入Javac StringBuilder/StringBuffer优化?   java mediaplayer在R.raw Android上失败   java JPA2:不区分大小写,就像在任何地方匹配一样   如何从JDK15中提取java预览类文件?   java与mySQL删除查询不一致   从Shutdownow()返回的java列表<Runnable>无法转换为提交的Runnable   java如何从回调接口获取对象值?   java如何获得视图的高度,在xml中可见性和高度定义为wrap_内容?   postgresql Mybatis在启动时遇到“由以下原因引起:java.net.UnknownHostException:localhost”,为什么?   带有实例调用的方法调用的java intellij格式化程序换行   由于特定的第三方库,java Proguard产生运行时错误   动画JAVA JPanel同时滑出和滑入