简 介: 对于从MindMotion SuYong发送过来的带有SoftI2C 的移植版本进行测试。初步证明了该SoftI2C移植功能。 利用OLED显示测试,可以看到该版本的SoftI2C的外部总线的命令非常慢。经过测试,可以看到该版本的SoftI2C对于输出时钟的控制没有准备好。

关键词I2CMM32MicroPython

#mermaid-svg-NsPt7MGpnSOrDIeV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NsPt7MGpnSOrDIeV .error-icon{fill:#552222;}#mermaid-svg-NsPt7MGpnSOrDIeV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NsPt7MGpnSOrDIeV .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-NsPt7MGpnSOrDIeV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NsPt7MGpnSOrDIeV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NsPt7MGpnSOrDIeV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NsPt7MGpnSOrDIeV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NsPt7MGpnSOrDIeV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NsPt7MGpnSOrDIeV .marker.cross{stroke:#333333;}#mermaid-svg-NsPt7MGpnSOrDIeV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NsPt7MGpnSOrDIeV .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NsPt7MGpnSOrDIeV .cluster-label text{fill:#333;}#mermaid-svg-NsPt7MGpnSOrDIeV .cluster-label span{color:#333;}#mermaid-svg-NsPt7MGpnSOrDIeV .label text,#mermaid-svg-NsPt7MGpnSOrDIeV span{fill:#333;color:#333;}#mermaid-svg-NsPt7MGpnSOrDIeV .node rect,#mermaid-svg-NsPt7MGpnSOrDIeV .node circle,#mermaid-svg-NsPt7MGpnSOrDIeV .node ellipse,#mermaid-svg-NsPt7MGpnSOrDIeV .node polygon,#mermaid-svg-NsPt7MGpnSOrDIeV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NsPt7MGpnSOrDIeV .node .label{text-align:center;}#mermaid-svg-NsPt7MGpnSOrDIeV .node.clickable{cursor:pointer;}#mermaid-svg-NsPt7MGpnSOrDIeV .arrowheadPath{fill:#333333;}#mermaid-svg-NsPt7MGpnSOrDIeV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NsPt7MGpnSOrDIeV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NsPt7MGpnSOrDIeV .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-NsPt7MGpnSOrDIeV .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-NsPt7MGpnSOrDIeV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NsPt7MGpnSOrDIeV .cluster text{fill:#333;}#mermaid-svg-NsPt7MGpnSOrDIeV .cluster span{color:#333;}#mermaid-svg-NsPt7MGpnSOrDIeV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NsPt7MGpnSOrDIeV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

MM32F3277
MicroPython
目 录
Contents
测试
MicroPython
将MicroPython
下载到MCU
初步测试
编程测试
测试端口
测试I2C OLED
连接OLED
初步测试
初始化OLED
测试总结
后期改动

§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功能测试相关推荐

  1. 测试MindMotion MM32F3277 MicroPython -2021-11-20新增PWM版本

    简 介: 对于初步实现的MicroPython的版本进行了测试.可以看到这个版本在MCU的硬件层面还存在BUG,在实际管脚上尚无法输出对应的PWM波形. 关键词: MM32,MicroPython,P ...

  2. 他花了一个月,使用MicroPython将自己装进OLED里面

    简 介: 完整的开源代码以及移植说明正在整理当中.建立共同的生态圈,使得更多人加入应用模块中,丰起羽翼.壮其筋骨.让更多非专业人士体会编程快乐. 关键词: MM32,MicroPython,OLED ...

  3. 将动画装入MicroPython I2C OLED

    简 介: 在测试了MicroPython对于OLED驱动的基础上,本文给出了将普通的视频转换成OLED可以显示的动画的过程.利用在SD卡中存储的文件,可以将大量视频过程进行播放.在实际过程中,由于Mi ...

  4. MindMotion MM32 单片机上的MicroPython移植-PWM

    简 介: 对于MindMotion在11月22日发送过来的移植有PWM功能的MicroPython的软件进行了测试.首先,在两个PWM的通道(PA6,PA7)上可以测试到输出的波形,但信号参数与设置之 ...

  5. MM32F3277 MicroPython的 mem 函数对于MCU内存访问

    简 介: 通过mem32,mem16,mem8可以使得MicroPython向访问数字一样访问MCU中的任意内存.在ARM模型下,所有的寄存器都是基于RAM地址访问,所以原则上,可以通过memxx编程 ...

  6. MM32F3277 MicroPython 的定时器功能

    简 介: 对于SuYong发送过来的带有Timer功能版本的MicroPython进行了测试.在新版的MicroPython中,可以最多定义两个不同频率的定时器中断,完成对于周期时间的控制和输出.这一 ...

  7. 利用SeekFree的核心板调试MM32F3277的ISP功能

    简 介: 最终,还是没有能够调通ISP的功能.问题出在哪儿?现在还不得而知. 关键词: MM32,ISP #mermaid-svg-peN6mHLQ6pUuJtoX {font-family:&quo ...

  8. 测试MindMotion 的 ISP功能 - 无法进入ISP功能

    简 介: 测试了MindMotion的ISP功能.但是第一步,显示无法进入MM32F3277的ISP的功能状态. 关键词: ISP,MM32,MM32F3277 #mermaid-svg-FHGjbT ...

  9. 设计带有SD卡的 MM32F3277 MicroPython 实验板

    简 介: 本文测试了基于MM32F3277下的MicroPython电路板设计.其中包含有SD卡接口,常用外设接口等.验证了现在的移植的MicroPython的对文件的基本操作功能.通过测试发现现在的 ...

最新文章

  1. 单点登陆的技术实现机制
  2. Ajax基础知识梳理
  3. Oracle数据库的认证方法、用户管理、权限管理和角色管理等
  4. 7、单向一对多的关联关系(1的一方有n的一方的集合属性,n的一方却没有1的一方的引用)...
  5. 当try,catch,finally中均有return语句时,会返回哪一个?---finally中的return
  6. vue 分模块打包 脚手架_Vue面试官最爱的底层源码问题,你可以这样回答!
  7. python中类的构成_Python中类型关系和继承关系实例详解
  8. ict测试机台_ICT自动测试机 PTI-818S 深圳市派捷电子科技有限公司
  9. 使用91地图助手转换坐标系,以大地2000转经纬度为例
  10. 现金流贴现法估值模型
  11. 【转】Java线程池实现原理及其在美团业务中的实践
  12. 井字游戏 Tic Tac Toe
  13. CTFSHOW 愚人节欢乐赛WP
  14. android摇一摇跳转界面,android摇一摇随机变图片
  15. 大数据时代的Serverless工作负载预测赛后总结
  16. 十五、商城 - 品牌管理-AngularJS(3)
  17. linux 查看python路径
  18. java英语单词总结
  19. idea设置java编译版本1.8
  20. roLabelImg安装与使用

热门文章

  1. 查看python安装的包
  2. ERP实施过程中的十个“拦路虎”
  3. [实战] 用数人云,部署弹性 ELK 集群就五步
  4. 使用JMeter进行性能测试
  5. linux定时运行命令脚本——crontab
  6. Linux 下 hosts 应用
  7. hdpi、mdpi、ldpi图片规格
  8. linux 日志主服务器 syslog
  9. Windows Azure Platform Introduction (2) 云计算的分类和服务层次
  10. Jenkins maven 编译一些问题