MindMotion MM32F3277 SoftI2C功能测试
简 介: 对于从MindMotion SuYong发送过来的带有SoftI2C 的移植版本进行测试。初步证明了该SoftI2C移植功能。 利用OLED显示测试,可以看到该版本的SoftI2C的外部总线的命令非常慢。经过测试,可以看到该版本的SoftI2C对于输出时钟的控制没有准备好。
关键词
: I2C,MM32,MicroPython
MicroPython
Contents
MicroPython
下载到MCU
§01 MM32F3277 MicroPython
今天(2021-11-25)收到MindMotion SuYong发送过来对于MM32F3277的MicroPython增加I2C总线功能的移植版本。
微蓝[SY]:
卓老师,这两天仅仅搞出来这么个鬼东西微蓝[SY]:
硬件的i2c驱动,估计需要我亲自操刀了微蓝[SY]:
如果soft i2c能用,我就着手先搞硬件spi的优化和pwm通道的扩展微蓝[SY]:
这样还可以给我们做i2c硬件驱动的同事一点时间,让她调代码,或者请逐飞帮忙
- 下载地址: firmware-2021-11-25
下面对于这个版本进行测试。
一、测试 MicroPython
1、将MicroPython下载到MCU
▲ 图1.1.1 下载MicroPython到MM32F3277
2、初步测试
(1)REPL 测试machine模块
>>> import machine
>>> dir(machine)
['__name__', 'ADC', 'DAC', 'PWM', 'Pin', 'SDCard', 'SPI', 'SoftI2C', 'SoftSPI', 'UART', 'freq', 'mem16', 'mem32', 'mem8']
>>>
3、编程测试
对于MicroPython关于I2C编程的文档参见: MicroPython class I2C
▲ 图1.1.2 I2C使用用例
(1)初步测试
Ⅰ.测试程序
from machine import I2C
import utimei2c = I2C(freq400000)
i2c.scan()
i2c.writeto(42, b'123')
Ⅱ.输出结果
>> Download MicroPython : 22 lines/515 characters.
>> -------------------------------------------------------------------------Traceback (most recent call last):File "<stdin>", line 9, in <module>
ImportError: can't import name I2C
>>>
(2)import SoftI2C
Ⅰ.测试代码
from machine import Pin,SoftI2C
i2c = SoftI2C(freq400000)
i2c.scan()
i2c.writeto(42, b'123')
Ⅱ.输出结果
>> Download MicroPython : 22 lines/524 characters.
>> -------------------------------------------------------------------------Traceback (most recent call last):File "<stdin>", line 10, in <module>
ImportError: module not found
>>>
4、测试端口
二、测试I2C OLED
在 乐鑫esp8266模块MicroPython开发板MQTT物联网人工智能最小系统 测试了 I2C OLED模块,下面将其连接在MM32F3277上。
1、连接OLED
▲ 图1.2.1 在面包板上将OLED连接在测试板上
2、初步测试
(1)扫描总线
Ⅰ.测试代码
from machine import Pin,SoftI2C
import utimeprint("Test I2C")scl = Pin('PA0')
sda = Pin('PA1')i2c = SoftI2C(scl, sda, freq=100000)ret = i2c.scan()
print(ret)
Ⅱ.输出结果
>> Download MicroPython : 26 lines/584 characters.
>> -------------------------------------------------------------------------Test I2C
[60]
>>>
从上面的scan得到的I2C的Slave的地址为60(0x3C),这与在 乐鑫esp8266模块MicroPython开发板MQTT物联网人工智能最小系统 给定的地址是一致的。
(2)测试写入
Ⅰ.测试代码
from machine import Pin,SoftI2C
import utime
from micropython import constscl = Pin('PA0')
sda = Pin('PA1')i2c = SoftI2C(scl, sda, freq=100000)ret = i2c.scan()
print(ret)temp = bytearray(2)
i2c.start()
temp[0] = 120
temp[1] = 1
i2c.write(temp)
i2c.stop()print('Test end.')
Ⅱ.输出结果
>> Download MicroPython : 34 lines/760 characters.
>> -------------------------------------------------------------------------[60]
2
Test end.
>>>
可以看到写入两个字节。
3、初始化OLED
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TESTI2C.PY -- by Dr. ZhuoQing 2021-11-25
#
# Note:
#============================================================
from machine import Pin,SoftI2C
import utime
from micropython import const
#------------------------------------------------------------
scl = Pin('PA0')
sda = Pin('PA1')
i2c = SoftI2C(scl, sda, freq=100000)
#------------------------------------------------------------
SET_CONTRAST = const(0x81)
SET_ENTIRE_ON = const(0xa4)
SET_NORM_INV = const(0xa6)
SET_DISP = const(0xae)
SET_MEM_ADDR = const(0x20)
SET_COL_ADDR = const(0x21)
SET_PAGE_ADDR = const(0x22)
SET_DISP_START_LINE = const(0x40)
SET_SEG_REMAP = const(0xa0)
SET_MUX_RATIO = const(0xa8)
SET_COM_OUT_DIR = const(0xc0)
SET_DISP_OFFSET = const(0xd3)
SET_COM_PIN_CFG = const(0xda)
SET_DISP_CLK_DIV = const(0xd5)
SET_PRECHARGE = const(0xd9)
SET_VCOM_DESEL = const(0xdb)
SET_CHARGE_PUMP = const(0x8d)
#------------------------------------------------------------
class SSD1306():def __init__(self, width, height, external_vcc):self.width = widthself.height = heightself.external_vcc = external_vccself.pages = self.height // 8self.buffer = bytearray(self.pages * self.width)self.init_display()def init_display(self):for cmd in (SET_DISP | 0x00, # offSET_MEM_ADDR, 0x00, # horizontalSET_DISP_START_LINE | 0x00,SET_SEG_REMAP | 0x01, # column addr 127 mapped to SEG0SET_MUX_RATIO, self.height - 1,SET_COM_OUT_DIR | 0x08, # scan from COM[N] to COM0SET_DISP_OFFSET, 0x00,SET_COM_PIN_CFG, 0x02 if self.height == 32 else 0x12,SET_DISP_CLK_DIV, 0x80,SET_PRECHARGE, 0x22 if self.external_vcc else 0xf1,SET_VCOM_DESEL, 0x30, # 0.83*VccSET_CONTRAST, 0xff, # maximumSET_ENTIRE_ON, # output follows RAM contentsSET_NORM_INV, # not invertedSET_CHARGE_PUMP, 0x10 if self.external_vcc else 0x14,SET_DISP | 0x01): # onself.write_cmd(cmd)self.fill(0xff)self.show()def fill(self, c):for i in range(len(self.buffer)):self.buffer[i] = cdef poweroff(self):self.write_cmd(SET_DISP | 0x00)def poweron(self):self.write_cmd(SET_DISP | 0x01)def contrast(self, contrast):self.write_cmd(SET_CONTRAST)self.write_cmd(contrast)def invert(self, invert):self.write_cmd(SET_NORM_INV | (invert & 1))def show(self):x0 = 0x1 = self.width - 1if self.width == 64:x0 += 32x1 += 32self.write_cmd(SET_COL_ADDR)self.write_cmd(x0)self.write_cmd(x1)self.write_cmd(SET_PAGE_ADDR)self.write_cmd(0)self.write_cmd(self.pages - 1)self.write_data(self.buffer)
class SSD1306_I2C(SSD1306):def __init__(self, width, height, i2c, addr=0x3c, external_vcc=False):self.i2c = i2cself.addr = addrself.temp = bytearray(2)super().__init__(width, height, external_vcc)def write_cmd(self, cmd):self.temp[0] = 0x80 # Co=1, D/C#=0self.temp[1] = cmdself.i2c.writeto(self.addr, self.temp)def write_data(self, buf):self.temp[0] = self.addr << 1self.temp[1] = 0x40 # Co=0, D/C#=1self.i2c.start()self.i2c.write(self.temp)self.i2c.write(buf)self.i2c.stop()
#------------------------------------------------------------
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)
#oled.text('Hello world!', 0, 0)
#oled.text('OLED test', 0, 50)
#oled. show()
#------------------------------------------------------------
# END OF FILE : TESTI2C.PY
#============================================================
下面是在OLED初始化过程中写入1024 个字节的过程,过程异常的缓慢。
▲ 图1.2.2 刷新OLED过程
之所以这么慢,通过示波器测试SCL,SDA的波形,可以看到此时的波特率只有400Hz, 与初始化的波特率相差很多。
▲ 图1.2.3 I2C总线的写过程
※ 测试总结 ※
对于从MindMotion SuYong发送过来的带有SoftI2C 的移植版本进行测试。初步证明了该SoftI2C移植功能。 利用OLED显示测试,可以看到该版本的SoftI2C的外部总线的命令非常慢。
经过测试,可以看到该版本的SoftI2C对于输出时钟的控制没有准备好。
一、后期改动
scl = Pin('PA0')
sda = Pin('PA1')i2c = SoftI2C(scl, sda, freq=400000)
过来一个小时之后SuYong发送过来改动后的版本。经过测试,波特率可以达到400kHz,功能妥妥的。
▲ 图2.1.1 波特率为400kHz
▲ 图2.1.2 利用SoftI2C控制OLED显示非常平顺了
from machine import Pin,SoftI2C
import utime
from micropython import constscl = Pin('PA0')
sda = Pin('PA1')i2c = SoftI2C(scl, sda, freq=400000)SET_CONTRAST = const(0x81)
SET_ENTIRE_ON = const(0xa4)
SET_NORM_INV = const(0xa6)
SET_DISP = const(0xae)
SET_MEM_ADDR = const(0x20)
SET_COL_ADDR = const(0x21)
SET_PAGE_ADDR = const(0x22)
SET_DISP_START_LINE = const(0x40)
SET_SEG_REMAP = const(0xa0)
SET_MUX_RATIO = const(0xa8)
SET_COM_OUT_DIR = const(0xc0)
SET_DISP_OFFSET = const(0xd3)
SET_COM_PIN_CFG = const(0xda)
SET_DISP_CLK_DIV = const(0xd5)
SET_PRECHARGE = const(0xd9)
SET_VCOM_DESEL = const(0xdb)
SET_CHARGE_PUMP = const(0x8d)font8x16 = bytes((0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))class SSD1306():def __init__(self, width, height, external_vcc):self.width = widthself.height = heightself.external_vcc = external_vccself.pages = self.height // 8self.buffer = bytearray(self.pages * self.width)self.init_display()def init_display(self):for cmd in (SET_DISP | 0x00, # offSET_MEM_ADDR, 0x00, # horizontalSET_DISP_START_LINE | 0x00,SET_SEG_REMAP | 0x01, # column addr 127 mapped to SEG0SET_MUX_RATIO, self.height - 1,SET_COM_OUT_DIR | 0x08, # scan from COM[N] to COM0SET_DISP_OFFSET, 0x00,SET_COM_PIN_CFG, 0x02 if self.height == 32 else 0x12,SET_DISP_CLK_DIV, 0x80,SET_PRECHARGE, 0x22 if self.external_vcc else 0xf1,SET_VCOM_DESEL, 0x30, # 0.83*VccSET_CONTRAST, 0xff, # maximumSET_ENTIRE_ON, # output follows RAM contentsSET_NORM_INV, # not invertedSET_CHARGE_PUMP, 0x10 if self.external_vcc else 0x14,SET_DISP | 0x01): # onself.write_cmd(cmd)self.fill(0x0)self.show()def fill(self, c):for i in range(len(self.buffer)):self.buffer[i] = cdef poweroff(self):self.write_cmd(SET_DISP | 0x00)def poweron(self):self.write_cmd(SET_DISP | 0x01)def contrast(self, contrast):self.write_cmd(SET_CONTRAST)self.write_cmd(contrast)def invert(self, invert):self.write_cmd(SET_NORM_INV | (invert & 1))def show(self):x0 = 0x1 = self.width - 1if self.width == 64:x0 += 32x1 += 32self.write_cmd(SET_COL_ADDR)self.write_cmd(x0)self.write_cmd(x1)self.write_cmd(SET_PAGE_ADDR)self.write_cmd(0)self.write_cmd(self.pages - 1)self.write_data(self.buffer)def setpoint(self, x,y):liney = y//8yy = 1<<(y%8)self.buffer[liney*self.width+x] |= yydef setstring(self, x,y,str):for c in str:cid = ord(c) - 0x20cid *= 16for i in range(8):ii = y*self.width+x*8+iself.buffer[ii] = font8x16[cid+i]self.buffer[ii+self.width] = font8x16[cid+i+8]x += 1if x >= self.width//8:x = 0y += 1class SSD1306_I2C(SSD1306):def __init__(self, width, height, i2c, addr=0x3c, external_vcc=False):self.i2c = i2cself.addr = addrself.temp = bytearray(2)super().__init__(width, height, external_vcc)def write_cmd(self, cmd):self.temp[0] = 0x80 # Co=1, D/C#=0self.temp[1] = cmdself.i2c.writeto(self.addr, self.temp)def write_data(self, buf):self.temp[0] = self.addr << 1self.temp[1] = 0x40 # Co=0, D/C#=1self.i2c.start()self.i2c.write(self.temp)self.i2c.write(buf)self.i2c.stop()oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)oled.setstring(0, 0, ' MM32F3277')
oled.setstring(0, 2, 'MicroPython:V2')
oled.show()count = 0
while True:oled.setstring(3, 6, 'Count:%04d'%count)count += 1oled.show()utime.sleep_ms(100)
■ 相关文献链接:
- firmware-2021-11-25
- MicroPython class I2C
- 乐鑫esp8266模块MicroPython开发板MQTT物联网人工智能最小系统
● 相关图表链接:
- 图1.1.1 下载MicroPython到MM32F3277
- 图1.1.2 I2C使用用例
- 图1.2.1 在面包板上将OLED连接在测试板上
- 图1.2.2 刷新OLED过程
- 图1.2.3 I2C总线的写过程
if(strncmp(szString, "MPDLD", 5) == 0) { // MicroPython Dlownloadchar szString[0x8000];Beep(1800, 50);strcpy(szString, "");Clipboard()->GetTextBuf(szString, sizeof(szString) - 1);SendChar(0x3, PORT1); // Send CTRL+BSleep(100);SendChar(0x3, PORT1); // Send CTRL+BSleep(100);ClearPort(PORT1);SendChar('\r', PORT1);double lfStart = GetDosTime();int nGreatCount = 0;int nGreatFlag = 0;for(;;) {if(GetDosTime() - lfStart > 1) break;char c;if(ReceChar(&c, PORT1) == 0) {if(c == '>') nGreatCount ++;if(c == ' ') {if(nGreatCount >= 3) {nGreatFlag = 1;break;}}}}ClearInfor();if(nGreatFlag == 0) {ShowInfor(">> Reset MicroPython...");RTSEnable(1, PORT1);Sleep(100);ClearPort(PORT1);RTSEnable(0, PORT1);ShowInfor(">> Wait for MicroPython coming back...");lfStart = GetDosTime();nGreatCount = 0;nGreatFlag = 0;for(;;) {if(GetDosTime() - lfStart > 3) break;char c;if(ReceChar(&c, PORT1) == 0) {if(c == '>') nGreatCount ++;if(c == ' ') {if(nGreatCount >= 3) {nGreatFlag = 1;break;}}}}}//-------------------------------------------------------------------int nLength = strlen(szString);int i;int nLine = 0;for(i = 0; i < nLength; i ++) {if(szString[i] == '\n') nLine ++;}char szTemp[512];sprintf(szTemp, ">> Download MicroPython : %d lines/%d characters.", nLine, nLength);ShowInfor(szTemp);Sleep(200);if(nGreatFlag == 0) {MessageBeep(0);SendChar(0x2, PORT1); // Send CTRL+BSleep(100);SendChar(0x2, PORT1); // Send CTRL+BSleep(100);}SendChar(0x5, PORT1); // Send CTRL+ESleep(100);for(i = 0; i < nLength; i ++) {ProgressBar1->Position = (i + 1) * 100 / nLength;char c = szString[i];if(c == '\r') continue;SendChar(c, PORT1);// if(c == '\n') Sleep(1);}/* int nSendLength = 0x10;int nSendTime = (nLength + nSendLength - 1) / nSendLength;for(i = 0; i < nSendTime; i ++) {ProgressBar1->Position = (i + 1) * 100 / nSendTime;int nBufLength = nLength - i * nSendLength;if(nBufLength > nSendLength) nBufLength = nSendLength;SendCharDim(&szString[i * nSendLength], nBufLength, PORT1);}
*/for(;;) {char c;if(ReceCharL(&c, PORT1, 20) > 0) break;}ShowInfor(">> -------------------------------------------------------------------------");SendChar(0x4, PORT1); // Send CTRL+BBeep(800, 100);return;}
MindMotion MM32F3277 SoftI2C功能测试相关推荐
- 测试MindMotion MM32F3277 MicroPython -2021-11-20新增PWM版本
简 介: 对于初步实现的MicroPython的版本进行了测试.可以看到这个版本在MCU的硬件层面还存在BUG,在实际管脚上尚无法输出对应的PWM波形. 关键词: MM32,MicroPython,P ...
- 他花了一个月,使用MicroPython将自己装进OLED里面
简 介: 完整的开源代码以及移植说明正在整理当中.建立共同的生态圈,使得更多人加入应用模块中,丰起羽翼.壮其筋骨.让更多非专业人士体会编程快乐. 关键词: MM32,MicroPython,OLED ...
- 将动画装入MicroPython I2C OLED
简 介: 在测试了MicroPython对于OLED驱动的基础上,本文给出了将普通的视频转换成OLED可以显示的动画的过程.利用在SD卡中存储的文件,可以将大量视频过程进行播放.在实际过程中,由于Mi ...
- MindMotion MM32 单片机上的MicroPython移植-PWM
简 介: 对于MindMotion在11月22日发送过来的移植有PWM功能的MicroPython的软件进行了测试.首先,在两个PWM的通道(PA6,PA7)上可以测试到输出的波形,但信号参数与设置之 ...
- MM32F3277 MicroPython的 mem 函数对于MCU内存访问
简 介: 通过mem32,mem16,mem8可以使得MicroPython向访问数字一样访问MCU中的任意内存.在ARM模型下,所有的寄存器都是基于RAM地址访问,所以原则上,可以通过memxx编程 ...
- MM32F3277 MicroPython 的定时器功能
简 介: 对于SuYong发送过来的带有Timer功能版本的MicroPython进行了测试.在新版的MicroPython中,可以最多定义两个不同频率的定时器中断,完成对于周期时间的控制和输出.这一 ...
- 利用SeekFree的核心板调试MM32F3277的ISP功能
简 介: 最终,还是没有能够调通ISP的功能.问题出在哪儿?现在还不得而知. 关键词: MM32,ISP #mermaid-svg-peN6mHLQ6pUuJtoX {font-family:&quo ...
- 测试MindMotion 的 ISP功能 - 无法进入ISP功能
简 介: 测试了MindMotion的ISP功能.但是第一步,显示无法进入MM32F3277的ISP的功能状态. 关键词: ISP,MM32,MM32F3277 #mermaid-svg-FHGjbT ...
- 设计带有SD卡的 MM32F3277 MicroPython 实验板
简 介: 本文测试了基于MM32F3277下的MicroPython电路板设计.其中包含有SD卡接口,常用外设接口等.验证了现在的移植的MicroPython的对文件的基本操作功能.通过测试发现现在的 ...
最新文章
- 单点登陆的技术实现机制
- Ajax基础知识梳理
- Oracle数据库的认证方法、用户管理、权限管理和角色管理等
- 7、单向一对多的关联关系(1的一方有n的一方的集合属性,n的一方却没有1的一方的引用)...
- 当try,catch,finally中均有return语句时,会返回哪一个?---finally中的return
- vue 分模块打包 脚手架_Vue面试官最爱的底层源码问题,你可以这样回答!
- python中类的构成_Python中类型关系和继承关系实例详解
- ict测试机台_ICT自动测试机 PTI-818S 深圳市派捷电子科技有限公司
- 使用91地图助手转换坐标系,以大地2000转经纬度为例
- 现金流贴现法估值模型
- 【转】Java线程池实现原理及其在美团业务中的实践
- 井字游戏 Tic Tac Toe
- CTFSHOW 愚人节欢乐赛WP
- android摇一摇跳转界面,android摇一摇随机变图片
- 大数据时代的Serverless工作负载预测赛后总结
- 十五、商城 - 品牌管理-AngularJS(3)
- linux 查看python路径
- java英语单词总结
- idea设置java编译版本1.8
- roLabelImg安装与使用