用micropython驱动各种外设是令人十分期待的事。可是社区里的驱动程序让我一头雾水——我很想理解这些代码的含义,可是网上却查询不到多少有用的信息。形形色色的Micropython教程中只是简单讲几句通讯协议在mp中对应的指令,却没讲这些命令的用法实例,对于一些单总线通讯的外设驱动途径更是无从查起。
社区内的大佬们能否针对某个外设(比如ws2812)的驱动写一些教程和批注?这是网上最缺乏的内容了
感谢各位大佬了!
关于MicroPython外设驱动的编写
Re: 关于MicroPython外设驱动的编写
比如下面的代码(驱动ds1302的)
代码: 全选
'''
DS1302 RTC drive
Author: shaoziyang
Date: 2018.3
http://www.micropython.org.cn
'''
from machine import *
DS1302_REG_SECOND = (0x80)
DS1302_REG_MINUTE = (0x82)
DS1302_REG_HOUR = (0x84)
DS1302_REG_DAY = (0x86)
DS1302_REG_MONTH = (0x88)
DS1302_REG_WEEKDAY= (0x8A)
DS1302_REG_YEAR = (0x8C)
DS1302_REG_WP = (0x8E)
DS1302_REG_CTRL = (0x90)
DS1302_REG_RAM = (0xC0)
class DS1302:
def __init__(self, clk, dio, cs):
self.clk = clk
self.dio = dio
self.cs = cs
self.clk.init(Pin.OUT)
self.cs.init(Pin.OUT)
def DecToHex(self, dat):
return (dat//10) * 16 + (dat%10)
def HexToDec(self, dat):
return (dat//16) * 10 + (dat%16)
def write_byte(self, dat):
self.dio.init(Pin.OUT)
for i in range(8):
self.dio.value((dat >> i) & 1)
self.clk.value(1)
self.clk.value(0)
def read_byte(self):
d = 0
self.dio.init(Pin.IN)
for i in range(8):
d = d | (self.dio.value()<<i)
self.clk.value(1)
self.clk.value(0)
return d
def getReg(self, reg):
self.cs.value(1)
self.write_byte(reg)
t = self.read_byte()
self.cs.value(0)
return t
def setReg(self, reg, dat):
self.cs.value(1)
self.write_byte(reg)
self.write_byte(dat)
self.cs.value(0)
def wr(self, reg, dat):
self.setReg(DS1302_REG_WP, 0)
self.setReg(reg, dat)
self.setReg(DS1302_REG_WP, 0x80)
def start(self):
t = self.getReg(DS1302_REG_SECOND + 1)
self.wr(DS1302_REG_SECOND, t & 0x7f)
def stop(self):
t = self.getReg(DS1302_REG_SECOND + 1)
self.wr(DS1302_REG_SECOND, t | 0x80)
def Second(self, second = None):
if second == None:
return self.HexToDec(self.getReg(DS1302_REG_SECOND+1))%60
else:
self.wr(DS1302_REG_SECOND, self.DecToHex(second%60))
def Minute(self, minute = None):
if minute == None:
return self.HexToDec(self.getReg(DS1302_REG_MINUTE+1))
else:
self.wr(DS1302_REG_MINUTE, self.DecToHex(minute%60))
def Hour(self, hour = None):
if hour == None:
return self.HexToDec(self.getReg(DS1302_REG_HOUR+1))
else:
self.wr(DS1302_REG_HOUR, self.DecToHex(hour%24))
def Weekday(self, weekday = None):
if weekday == None:
return self.HexToDec(self.getReg(DS1302_REG_WEEKDAY+1))
else:
self.wr(DS1302_REG_WEEKDAY, self.DecToHex(weekday%8))
def Day(self, day = None):
if day == None:
return self.HexToDec(self.getReg(DS1302_REG_DAY+1))
else:
self.wr(DS1302_REG_DAY, self.DecToHex(day%32))
def Month(self, month = None):
if month == None:
return self.HexToDec(self.getReg(DS1302_REG_MONTH+1))
else:
self.wr(DS1302_REG_MONTH, self.DecToHex(month%13))
def Year(self, year = None):
if year == None:
return self.HexToDec(self.getReg(DS1302_REG_YEAR+1)) + 2000
else:
self.wr(DS1302_REG_YEAR, self.DecToHex(year%100))
def DateTime(self, dat = None):
if dat == None:
return [self.Year(), self.Month(), self.Day(), self.Weekday(), self.Hour(), self.Minute(), self.Second()]
else:
self.Year(dat[0])
self.Month(dat[1])
self.Day(dat[2])
self.Weekday(dat[3])
self.Hour(dat[4])
self.Minute(dat[5])
self.Second(dat[6])
def ram(self, reg, dat = None):
if dat == None:
return self.getReg(DS1302_REG_RAM + 1 + (reg%31)*2)
else:
self.wr(DS1302_REG_RAM + (reg%31)*2, dat)
def SetTime(self,YEAR,MONTH,DAY,WEEK,HOUR,MINUTE,SECOND,):
self.Year(YEAR)
self.Month(MONTH)
self.Day(DAY)
self.Weekday(WEEK)
self.Hour(HOUR)
self.Minute(MINUTE)
self.Second(SECOND)
代码: 全选
def __init__(self, clk, dio, cs):
self.clk = clk
self.dio = dio
self.cs = cs
self.clk.init(Pin.OUT)
self.cs.init(Pin.OUT)
- shaoziyang
- 帖子: 3980
- 注册时间: 2019年 10月 21日 13:48
Re: 关于MicroPython外设驱动的编写
这是python的一种写法,self是代表class的,self.cs就是一个GPIO,这样拆开就好理解了。
- shaoziyang
- 帖子: 3980
- 注册时间: 2019年 10月 21日 13:48
Re: 关于MicroPython外设驱动的编写
关于驱动的编写,可以参考一下以前的一个视频:(转)带你进入MicroPython的奇妙世界
-
- 随机主题
- 回复总数
- 阅读次数
- 最新文章
-
- 1回复总数
- 990 阅读次数
- 最新文章 由 shaoziyang
2021年 10月 24日 15:06
-
- 7回复总数
- 1356 阅读次数
- 最新文章 由 zwjiang
2021年 10月 25日 08:56
-
- 7回复总数
- 1281 阅读次数
- 最新文章 由 zwjiang
2021年 10月 26日 09:14