关于MicroPython外设驱动的编写

树莓派 PICO 和 RP2040 相关应用讨论
回复
hungsying
帖子: 2
注册时间: 2023年 10月 3日 14:31

关于MicroPython外设驱动的编写

#1

帖子 hungsying »

用micropython驱动各种外设是令人十分期待的事。可是社区里的驱动程序让我一头雾水——我很想理解这些代码的含义,可是网上却查询不到多少有用的信息。形形色色的Micropython教程中只是简单讲几句通讯协议在mp中对应的指令,却没讲这些命令的用法实例,对于一些单总线通讯的外设驱动途径更是无从查起。

社区内的大佬们能否针对某个外设(比如ws2812)的驱动写一些教程和批注?这是网上最缺乏的内容了 :o

感谢各位大佬了! :ugeek:
 
 

hungsying
帖子: 2
注册时间: 2023年 10月 3日 14:31

Re: 关于MicroPython外设驱动的编写

#2

帖子 hungsying »

 
比如下面的代码(驱动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)
方法中的self.clk.init(Pin.OUT)self.cs.init(Pin.OUT)这句话是什么意思?init是一个方法吗?
 

 

头像
shaoziyang
帖子: 3972
注册时间: 2019年 10月 21日 13:48

Re: 关于MicroPython外设驱动的编写

#3

帖子 shaoziyang »

这是python的一种写法,self是代表class的,self.cs就是一个GPIO,这样拆开就好理解了。

 

头像
shaoziyang
帖子: 3972
注册时间: 2019年 10月 21日 13:48

Re: 关于MicroPython外设驱动的编写

#4

帖子 shaoziyang »

关于驱动的编写,可以参考一下以前的一个视频:(转)带你进入MicroPython的奇妙世界

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章