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)错误的任何警告,像特拉维斯将。这是
本地验证它是否通过的好方法。
:目标: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
pip安装sphinx sphinx rtd主题
代码块:shell
cd docs
sphinx build-e-w-b html。_ build/html
这将把文档输出到"docs/u build/html"。在浏览器中打开index.html以查看它们。它还将(由于-w)错误的任何警告,像特拉维斯将。这是
本地验证它是否通过的好方法。