简 介: 初步对于MindMotion给出的MM32F3277上的MicroPython移植的程序中SPI的功能进行了测试。并给出了其中出现的问题以及修改的建议。

关键词MM32F3277MicroPythonMindMotion

#mermaid-svg-ruVqZHVwSXPyRIFs .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .label text{fill:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .node rect,#mermaid-svg-ruVqZHVwSXPyRIFs .node circle,#mermaid-svg-ruVqZHVwSXPyRIFs .node ellipse,#mermaid-svg-ruVqZHVwSXPyRIFs .node polygon,#mermaid-svg-ruVqZHVwSXPyRIFs .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-ruVqZHVwSXPyRIFs .node .label{text-align:center;fill:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .node.clickable{cursor:pointer}#mermaid-svg-ruVqZHVwSXPyRIFs .arrowheadPath{fill:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-ruVqZHVwSXPyRIFs .flowchart-link{stroke:#333;fill:none}#mermaid-svg-ruVqZHVwSXPyRIFs .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-ruVqZHVwSXPyRIFs .edgeLabel rect{opacity:0.9}#mermaid-svg-ruVqZHVwSXPyRIFs .edgeLabel span{color:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-ruVqZHVwSXPyRIFs .cluster text{fill:#333}#mermaid-svg-ruVqZHVwSXPyRIFs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-ruVqZHVwSXPyRIFs .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-ruVqZHVwSXPyRIFs text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-ruVqZHVwSXPyRIFs .actor-line{stroke:grey}#mermaid-svg-ruVqZHVwSXPyRIFs .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-ruVqZHVwSXPyRIFs #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .sequenceNumber{fill:#fff}#mermaid-svg-ruVqZHVwSXPyRIFs #sequencenumber{fill:#333}#mermaid-svg-ruVqZHVwSXPyRIFs #crosshead path{fill:#333;stroke:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .messageText{fill:#333;stroke:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-ruVqZHVwSXPyRIFs .labelText,#mermaid-svg-ruVqZHVwSXPyRIFs .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-ruVqZHVwSXPyRIFs .loopText,#mermaid-svg-ruVqZHVwSXPyRIFs .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-ruVqZHVwSXPyRIFs .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-ruVqZHVwSXPyRIFs .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-ruVqZHVwSXPyRIFs .noteText,#mermaid-svg-ruVqZHVwSXPyRIFs .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-ruVqZHVwSXPyRIFs .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-ruVqZHVwSXPyRIFs .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-ruVqZHVwSXPyRIFs .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-ruVqZHVwSXPyRIFs .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ruVqZHVwSXPyRIFs .section{stroke:none;opacity:0.2}#mermaid-svg-ruVqZHVwSXPyRIFs .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-ruVqZHVwSXPyRIFs .section2{fill:#fff400}#mermaid-svg-ruVqZHVwSXPyRIFs .section1,#mermaid-svg-ruVqZHVwSXPyRIFs .section3{fill:#fff;opacity:0.2}#mermaid-svg-ruVqZHVwSXPyRIFs .sectionTitle0{fill:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .sectionTitle1{fill:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .sectionTitle2{fill:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .sectionTitle3{fill:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ruVqZHVwSXPyRIFs .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-ruVqZHVwSXPyRIFs .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ruVqZHVwSXPyRIFs .grid path{stroke-width:0}#mermaid-svg-ruVqZHVwSXPyRIFs .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-ruVqZHVwSXPyRIFs .task{stroke-width:2}#mermaid-svg-ruVqZHVwSXPyRIFs .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ruVqZHVwSXPyRIFs .taskText:not([font-size]){font-size:11px}#mermaid-svg-ruVqZHVwSXPyRIFs .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ruVqZHVwSXPyRIFs .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-ruVqZHVwSXPyRIFs .task.clickable{cursor:pointer}#mermaid-svg-ruVqZHVwSXPyRIFs .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-ruVqZHVwSXPyRIFs .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-ruVqZHVwSXPyRIFs .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-ruVqZHVwSXPyRIFs .taskText0,#mermaid-svg-ruVqZHVwSXPyRIFs .taskText1,#mermaid-svg-ruVqZHVwSXPyRIFs .taskText2,#mermaid-svg-ruVqZHVwSXPyRIFs .taskText3{fill:#fff}#mermaid-svg-ruVqZHVwSXPyRIFs .task0,#mermaid-svg-ruVqZHVwSXPyRIFs .task1,#mermaid-svg-ruVqZHVwSXPyRIFs .task2,#mermaid-svg-ruVqZHVwSXPyRIFs .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-ruVqZHVwSXPyRIFs .taskTextOutside0,#mermaid-svg-ruVqZHVwSXPyRIFs .taskTextOutside2{fill:#000}#mermaid-svg-ruVqZHVwSXPyRIFs .taskTextOutside1,#mermaid-svg-ruVqZHVwSXPyRIFs .taskTextOutside3{fill:#000}#mermaid-svg-ruVqZHVwSXPyRIFs .active0,#mermaid-svg-ruVqZHVwSXPyRIFs .active1,#mermaid-svg-ruVqZHVwSXPyRIFs .active2,#mermaid-svg-ruVqZHVwSXPyRIFs .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-ruVqZHVwSXPyRIFs .activeText0,#mermaid-svg-ruVqZHVwSXPyRIFs .activeText1,#mermaid-svg-ruVqZHVwSXPyRIFs .activeText2,#mermaid-svg-ruVqZHVwSXPyRIFs .activeText3{fill:#000 !important}#mermaid-svg-ruVqZHVwSXPyRIFs .done0,#mermaid-svg-ruVqZHVwSXPyRIFs .done1,#mermaid-svg-ruVqZHVwSXPyRIFs .done2,#mermaid-svg-ruVqZHVwSXPyRIFs .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-ruVqZHVwSXPyRIFs .doneText0,#mermaid-svg-ruVqZHVwSXPyRIFs .doneText1,#mermaid-svg-ruVqZHVwSXPyRIFs .doneText2,#mermaid-svg-ruVqZHVwSXPyRIFs .doneText3{fill:#000 !important}#mermaid-svg-ruVqZHVwSXPyRIFs .crit0,#mermaid-svg-ruVqZHVwSXPyRIFs .crit1,#mermaid-svg-ruVqZHVwSXPyRIFs .crit2,#mermaid-svg-ruVqZHVwSXPyRIFs .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-ruVqZHVwSXPyRIFs .activeCrit0,#mermaid-svg-ruVqZHVwSXPyRIFs .activeCrit1,#mermaid-svg-ruVqZHVwSXPyRIFs .activeCrit2,#mermaid-svg-ruVqZHVwSXPyRIFs .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-ruVqZHVwSXPyRIFs .doneCrit0,#mermaid-svg-ruVqZHVwSXPyRIFs .doneCrit1,#mermaid-svg-ruVqZHVwSXPyRIFs .doneCrit2,#mermaid-svg-ruVqZHVwSXPyRIFs .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-ruVqZHVwSXPyRIFs .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-ruVqZHVwSXPyRIFs .milestoneText{font-style:italic}#mermaid-svg-ruVqZHVwSXPyRIFs .doneCritText0,#mermaid-svg-ruVqZHVwSXPyRIFs .doneCritText1,#mermaid-svg-ruVqZHVwSXPyRIFs .doneCritText2,#mermaid-svg-ruVqZHVwSXPyRIFs .doneCritText3{fill:#000 !important}#mermaid-svg-ruVqZHVwSXPyRIFs .activeCritText0,#mermaid-svg-ruVqZHVwSXPyRIFs .activeCritText1,#mermaid-svg-ruVqZHVwSXPyRIFs .activeCritText2,#mermaid-svg-ruVqZHVwSXPyRIFs .activeCritText3{fill:#000 !important}#mermaid-svg-ruVqZHVwSXPyRIFs .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ruVqZHVwSXPyRIFs g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-ruVqZHVwSXPyRIFs g.classGroup text .title{font-weight:bolder}#mermaid-svg-ruVqZHVwSXPyRIFs g.clickable{cursor:pointer}#mermaid-svg-ruVqZHVwSXPyRIFs g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-ruVqZHVwSXPyRIFs g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-ruVqZHVwSXPyRIFs .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-ruVqZHVwSXPyRIFs .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-ruVqZHVwSXPyRIFs .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-ruVqZHVwSXPyRIFs .dashed-line{stroke-dasharray:3}#mermaid-svg-ruVqZHVwSXPyRIFs #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-ruVqZHVwSXPyRIFs #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-ruVqZHVwSXPyRIFs #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-ruVqZHVwSXPyRIFs #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-ruVqZHVwSXPyRIFs #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-ruVqZHVwSXPyRIFs #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-ruVqZHVwSXPyRIFs #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-ruVqZHVwSXPyRIFs #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-ruVqZHVwSXPyRIFs .commit-id,#mermaid-svg-ruVqZHVwSXPyRIFs .commit-msg,#mermaid-svg-ruVqZHVwSXPyRIFs .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ruVqZHVwSXPyRIFs .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ruVqZHVwSXPyRIFs .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ruVqZHVwSXPyRIFs g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ruVqZHVwSXPyRIFs g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-ruVqZHVwSXPyRIFs g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-ruVqZHVwSXPyRIFs g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-ruVqZHVwSXPyRIFs g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-ruVqZHVwSXPyRIFs g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-ruVqZHVwSXPyRIFs .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-ruVqZHVwSXPyRIFs .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-ruVqZHVwSXPyRIFs .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-ruVqZHVwSXPyRIFs .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-ruVqZHVwSXPyRIFs .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-ruVqZHVwSXPyRIFs .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-ruVqZHVwSXPyRIFs .edgeLabel text{fill:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ruVqZHVwSXPyRIFs .node circle.state-start{fill:black;stroke:black}#mermaid-svg-ruVqZHVwSXPyRIFs .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-ruVqZHVwSXPyRIFs #statediagram-barbEnd{fill:#9370db}#mermaid-svg-ruVqZHVwSXPyRIFs .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-ruVqZHVwSXPyRIFs .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-ruVqZHVwSXPyRIFs .statediagram-state .divider{stroke:#9370db}#mermaid-svg-ruVqZHVwSXPyRIFs .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-ruVqZHVwSXPyRIFs .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-ruVqZHVwSXPyRIFs .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-ruVqZHVwSXPyRIFs .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-ruVqZHVwSXPyRIFs .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-ruVqZHVwSXPyRIFs .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-ruVqZHVwSXPyRIFs .note-edge{stroke-dasharray:5}#mermaid-svg-ruVqZHVwSXPyRIFs .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-ruVqZHVwSXPyRIFs .error-icon{fill:#522}#mermaid-svg-ruVqZHVwSXPyRIFs .error-text{fill:#522;stroke:#522}#mermaid-svg-ruVqZHVwSXPyRIFs .edge-thickness-normal{stroke-width:2px}#mermaid-svg-ruVqZHVwSXPyRIFs .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-ruVqZHVwSXPyRIFs .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-ruVqZHVwSXPyRIFs .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-ruVqZHVwSXPyRIFs .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-ruVqZHVwSXPyRIFs .marker{fill:#333}#mermaid-svg-ruVqZHVwSXPyRIFs .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-ruVqZHVwSXPyRIFs {color: rgba(0, 0, 0, 0.75);font: ;}

增加SPI功能
文章目录
功能调用
功能测试
测试SPI
基本功能
极限测试
测试SoftSPI
基本测试
测试问题
测试错误
建议修改
测试总结

§01 增加SPI功能


  在今天(2021-11-17)收到MindMotion Suyong发送的MM32F3277的MicroPython的移植版本。其中增加了对于SPI功能的支持。

▲ 图1.1 对于SPI的支持

  在 在mm32f3270上为micropython创建SPI模块 SuYong给出了SPI的移植方法总结。

一、功能调用

1、管脚定义

const machine_hw_spi_obj_t hw_spi_0 = {.base = { &machine_hw_spi_type }, .sck_pin_obj = &pin_PA5, .sck_pin_af = GPIO_AF_5, .mosi_pin_obj = &pin_PA7, .mosi_pin_af = GPIO_AF_5, .miso_pin_obj = &pin_PA6, .miso_pin_af = GPIO_AF_5, .spi_port = SPI1, .spi_irqn = SPI1_IRQn, .spi_id = 0u, .conf = &machine_hw_spi_conf[0]};const machine_hw_spi_obj_t hw_spi_1 = {.base = { &machine_hw_spi_type }, .sck_pin_obj = &pin_PA3, .sck_pin_af = GPIO_AF_5, .mosi_pin_obj = &pin_PB4, .mosi_pin_af = GPIO_AF_5, .miso_pin_obj = &pin_PB3, .miso_pin_af = GPIO_AF_5, .spi_port = SPI2, .spi_irqn = SPI2_IRQn, .spi_id = 1u, .conf = &machine_hw_spi_conf[1]};const machine_hw_spi_obj_t hw_spi_2 = {.base = { &machine_hw_spi_type }, .sck_pin_obj = &pin_PC9, .sck_pin_af = GPIO_AF_5, .mosi_pin_obj = &pin_PA8, .mosi_pin_af = GPIO_AF_5, .miso_pin_obj = &pin_PB9, .miso_pin_af = GPIO_AF_5, .spi_port = SPI3, .spi_irqn = SPI3_IRQn, .spi_id = 2u, .conf = &machine_hw_spi_conf[2]};const machine_hw_spi_obj_t * machine_hw_spi_objs[] =
{&hw_spi_0,&hw_spi_1,&hw_spi_2,
};

  根据上面代码可以看到对应的SPI端口定义如下:

【表1-1-1 SPI端口定义】
SPI管脚 SCK MOSI MISO
SPI0 PA5 PA7 PA6
SPI1 PA3 PB4 PB3
SPI2 PC9 PA8 PB9

2、程序界面

  关于程序调用,可以参照MicroPython官方说明:

  class SPI – a Serial Peripheral Interface bus protocol (controller side)

二、功能测试

1、下载MicroPython程序

  可以从 MindMotion-2021-11-17 下载对应的版本。

  使用 MM23-Link 将上述程序下载到 MM32F3277实验电路板(带有SD卡) 中进行测试。

▲ 图1.2.1 实验电路板

2、上电运行

  通过 CH340C制作的MicroPython的ESP8266,ESP32下载器 连入电脑。利用 STM32 Bootloader 软件作为界面,与MicroPython REPL进行交互。

(1) 上电显示

  下面是MM32F3277 MicroPython上电后通过REPL输出的内容。

>> Open COM8, baud : 115200[Y] sdcard ready.
[Y] file system on sdcard ready.
[Y] run the main.py on disk ...
[Y] done. 1
MicroPython v1.16 on 2021-11-17; MB_F3270 with MM32F3277G7P
>>>

(2) 交互信息

  输入import machine 指令,通过 dir 获得machine可以使用的模块。下面可以看到该版本中,相比于之前 制作灵动单片机MM32F3277 测试版 已经增加了 SPI, SoftSPI两个功能。

>>> import machine
>>> dir(machine)
['__name__', 'ADC', 'DAC', 'Pin', 'SDCard', 'SPI', 'SoftSPI', 'UART', 'freq', 'mem16', 'mem32', 'mem8']
>>>

§02 测试SPI


一、基本功能

1、REPL交互

  通过REPL输入命令,查看machine中的功能。

>>> dir(machine.SPI)
['read', 'readinto', 'write', 'LSB', 'MSB', 'deinit', 'init', 'write_readinto']
>>> dir(machine.SoftSPI)
['read', 'readinto', 'write', 'LSB', 'MSB', 'deinit', 'init', 'write_readinto']
>>>

2、print SPI

(1) 测试代码

from machine                import Pin,SPI
import utimeprint(SPI(0))
print(SPI(1))
print(SPI(2))

(2) 测试结果

>> Download MicroPython : 22 lines/504 characters.
>> -------------------------------------------------------------------------SPI(id=0, baudrate=80000000, polarity=0, phase=0)
SPI(id=1, baudrate=80000000, polarity=0, phase=0)
SPI(id=2, baudrate=80000000, polarity=0, phase=0)
>>>

3、基本输出波形

(1) 测试代码

from machine                import Pin,SPI
import utimespi = SPI(0)print("Begin to send 0x55 from SPI0.\r\n")buf = bytes((0x55,0xaa))while True:spi.write(buf)utime.sleep_ms(10)

(2) 测试结果

  测量SCK(A05),MOSI(A07)信号波形。波形如下图所示:

▲ 图2.1.1 SCK(A05)与MOSI(A07)的波形

  可以看到连续两个信号之间发送的时间间隔为1.38us。

(3)建议改进

  为了提高发送的速度,建议能够使用DMA,使得SPI发送byte连续起来。

  比如在 WS2812串行可控彩色LED灯珠 测试了 ESP32的MicroPython的SPI特性,它可以连续发送SPI字节,这样便可以利用SPI驱动WS2812LED灯珠了。

4、设置波特率

(1)测试代码与结果

from machine                import Pin,SPI
import utimespi = SPI(0, baudrate=10000)
print("Begin to send 0x55 from SPI0.\r\n")
buf = bytes((0x55,0xaa))while True:spi.write(buf)utime.sleep_ms(10)

  在波特率为10000下输出的SCK(A05),MOSI(A07)的波形,通过波形可以看到:

  • SCK的频率为10kHz
  • 两个发送数据之间的时间间隔为:248us。

▲ 图2.1.2 在波特率为10000下输出的SCK(A05),MOSI(A07)的波形

(2)存在问题

  对比在不同发送波特率下,两次发送数据之间的时间间隔不同。

  为什么两次发送数据之间的时间间隔出现不同呢?

5、不同SPI参数

(1)修改Polarity=1

from machine                import Pin,SPI
import utimespi = SPI(0, baudrate=10000, polarity=1, phase=0)
print("Begin to send 0x55 from SPI0.\r\n")
buf = bytes((0x55,0xaa))while True:spi.write(buf)utime.sleep_ms(10)

▲ 图2.1.3 Polarity=1情况下对应的SCK,MOSI波形

(2)修改Phase=1

▲ 图2.1.4 Polarity=1,Phase=1对应的SCK,MOSI波形

6、测试接收

(1)测试代码和结果

from machine                import Pin,SPI
import utimespi = SPI(0, baudrate=10000, polarity=1, phase=1)
print("Begin to send 0x55 from SPI0.\r\n")print(spi)
buf = bytes((0x55,0xaa))while True:utime.sleep_ms(500)recbuf = spi.read(2, 0xaa)print(recbuf)

▲ 图2.1.5 对应SCK, MOSI波形

 Ⅰ.将MOSI,MISO断开

  在MOSI,MISO没有使用杜邦线连接的时候,接收到的字节为: 0xff, 0xff

 Ⅱ.将MISO,MOSI短接

  使用杜邦线将MOSI,MISO短接,此时接收到的字节为: 0xaa,0xaa 。就是发送的字符。

二、极限测试

1、波特率

(1)缺省波特率

  缺省的波特率为 24MHz。

▲ 图2.2.1 缺省的波特率为24MHz

(2)最低波特率

  可以测量到,最低的波特率对应的 96MHz的 2172^{17}217分频,对应着96×106217=732.4Hz{{96 \times 10^6 } \over {2^{17} }} = 732.4Hz21796×106​=732.4Hz

  当baudrate设置为733时,输出波形如下。 当baudrate设置为732时,SPI输出的波特率就出现错误。

▲ 图2.2.2 设置为baudrate=733时对应的Clock波形

2、缓存长度

  使用如下代码申请100k长度的字节缓存的时候,运行出现错误。

buf = bytes((0x55,)*100000)
print(buf)
print(len(buf))

  返回显示,申请得400008个字节。出现错误。

>> Reset MicroPython...
>> Wait for MicroPython coming back...
>> Download MicroPython : 29 lines/653 characters.
>> -------------------------------------------------------------------------Begin to send 0x55 from SPI0.Traceback (most recent call last):File "<stdin>", line 16, in <module>
MemoryError: memory allocation failed, allocating 400008 bytes
>>>

  经过修改,会发现申请空间的长度最多为12.3k×4=50k左右字节左右。

(1)注意问题

  申明一个字节的缓冲区,需要使用:

buf = bytes((0x55,))

  如果错误写成:

buf = bytes((0x55))

  它对应的是:0x55(85)个 连续的 0!

§03 测试SoftSPI


一、基本测试

1、基本发送

(1)测试代码

from machine                import Pin,SPI,freq,SoftSPI
import utimespi = SoftSPI(baudrate=2000, sck='PA0', mosi='PA1', miso='PA2')print("Begin to send 0x55 from SPI0.\r\n")buf = bytes((0x55, 0x55))while True:spi.write(buf)utime.sleep_ms(200)

(2)测试结果

  通过示波器测试PA0(SCK),PA1(MOSI)上的波形,可以看到由信号输出。

  但是,对应的波特率只有400Hz,与设置的不相符合。

▲ 图3.1.1 测试PA0,PA1上的波形

  无论如何修改baudrate,都无法改变SoftSPI的波特率。

  观察两个完整的0x55发送的波形,可以看到,SoftSPI对应的字节的发送是 连续发送的

▲ 图3.1.2 完整的两个0x55发送对应的SCK,MOSI波形

2、改变配置参数

(1)改变Polarity

▲ 图3.1.3 设置Polarity=1对应的SCK,MOSI波形

(2)修改Phase

▲ 图3.1.4 设置Polarity=1,Phase=1对应的SCK,MOSI波形

3、测试读取

(1)测试代码

from machine                import Pin,SPI,freq,SoftSPI
import utimespi = SoftSPI(baudrate=10000, sck='PA0', mosi='PA1', miso='PA2', polarity=1, phase=1)print("Begin to send 0x55 from SPI0.\r\n")buf = bytes((0x55, 0x55))while True:spi.write(buf)utime.sleep_ms(200)print(spi.read(1,0x55))

(2)测试结果

  在MOSI(PA1),MISO(PA2)断开的时候,print()输出为 0xff;

  使用杜邦线将MOSI,MISO短接之后,print()输出为0x55。

  这表明接收正常,接收到的字符就是发送的字符。

§04 测试问题


一、测试错误

1、SoftSPI的波特率

  根据【3.1.1:基本发送】测试结果来看,SoftSPI的波特率无法被改变,只有400Hz。

二、建议修改

1、发送间隔

  缩短连续两个发送byte之间的间隔,最好能够做到像 WS2812串行可控彩色LED灯珠 测量ESP32中SPI数据见没有时间间隔。

  下面是在CLK=2.5MHz下,连续发送两个0x55对应的CLK, MOSI波形:

▲ 图3.2.1 在CLK2.5MHz下,连续发送两个0x55对应的CLK, MOSI波形

2、MCU主频

  现在MCU的工作主频为96MHz, 建议修改成120MHz,以利于MicroPython的实际执行速度。

※ 测试总结 ※


  初步对于MindMotion给出的MM32F3277上的MicroPython移植的程序中SPI的功能进行了测试。并给出了其中出现的问题以及修改的建议。


■ 相关文献链接:

  • 在mm32f3270上为micropython创建SPI模块
  • class SPI – a Serial Peripheral Interface bus protocol (controller side)
  • MindMotion-2021-11-17
  • 关于MM32-Link Programmer软件修改建议
  • 设计带有SD卡的 MM32F3277 MicroPython 实验板
  • 利用CH340C制作MicroPython ESP8266,ESP32的下载器-改进型
  • STM32 Bootloader
  • 制作灵动单片机MM32F3277 测试版
  • WS2812串行可控彩色LED灯珠

● 相关图表链接:

  • 图1.1 对于SPI的支持
  • 表1-1-1 SPI端口定义
  • 图1.2.1 实验电路板
  • 图2.1.1 SCK(A05)与MOSI(A07)的波形
  • 图2.1.2 在波特率为10000下输出的SCK(A05),MOSI(A07)的波形
  • 图2.1.3 Polarity=1情况下对应的SCK,MOSI波形
  • 图2.1.4 Polarity=1,Phase=1对应的SCK,MOSI波形
  • 图2.1.5 对应SCK, MOSI波形
  • 图2.2.1 缺省的波特率为24MHz
  • 图2.2.2 设置为baudrate=733时对应的Clock波形
  • 图3.1.1 测试PA0,PA1上的波形
  • 图3.1.2 完整的两个0x55发送对应的SCK,MOSI波形
  • 图3.1.3 设置Polarity=1对应的SCK,MOSI波形
  • 图3.1.4 设置Polarity=1,Phase=1对应的SCK,MOSI波形
  • 图3.2.1 在CLK2.5MHz下,连续发送两个0x55对应的CLK, MOSI波形

测试MM32F3277-MicroPython 2021-11-17 版本相关推荐

  1. AWD平台搭建(Cardinal 从零开始) 2021/11/17

    #Time 2021/11/17 因为之后要在校内组织AWD比赛,所以在github上找了一会,试了试最多star的,虽然说好用但是没有好康的界面,全是一堆代码感觉很枯燥,于是最终还是选择了使用Car ...

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

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

  3. 2021.11.17 关于一元二次方程组求根

    题目:定义一个名为equation的函数,实现求解一元二次方程组(标准形式)的根.equation接收四个参数,第一个参数是二次项的系数(a)第二个参数是一次项的系数(b)第三个参数是常数项(c)第四 ...

  4. 2021.11.17

    使用函数输出一个实心的字符矩形 (15 分) 本题要求实现函数输出一个实心的字符矩形,定义并调用函数matrix(length, width, ch),它的功能是在屏幕上显示行数为width.列数为l ...

  5. 2021.11.17洛谷小鱼游泳进阶版——c语言

    题目背景 原来的题目太简单,现改进让小鱼周末也休息,请已经做过重做该题. 题目描述 有一只小鱼,它平日每天游泳 250 公里,周末休息(实行双休日),假设从周 x(1\le x \le 7)x(1≤x ...

  6. 测试逐飞的MM32F3277 MicroPython开发板的基本功能

    简 介: 对于给定的MicroPython移植版本进行了初步的测试.对比之下,MCU中还有很多的模块尚未支持.这些工作需要近期尽快补充测试完毕. 关键词: MM32,MicroPython #merm ...

  7. 由于 Typora 开始收费,之前采用版本:0.11.17.0 能解决。突然出现提示: This beta version of Typora is expired .....

    问题报错 This beta version of Typora is expired, please download and install a newer version. 打开 0.11.17 ...

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

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

  9. MM32F3277 MicroPython 实验板设计和软件测试

    简 介: 对于截止到(2021-11-08 21:13:44)来自灵动的MicroPython在MM32F3277上的一致的基本功能进行测试.并给除了MicroPython的相关模块的の基本测试调用版 ...

  10. 测试MM32 MicroPython测试电路板的基本功能

    简 介: 对于来自于逐飞的MM32 MicroPython模块进行补充测试.总结了现在一些缺少的功能. 关键词: MicroPython,MM32,逐飞,灵动单片机 #mermaid-svg-JjPS ...

最新文章

  1. 5天玩转PyTorch深度学习,从GAN到词嵌入都有实例丨教程资源
  2. linux shell Bad substitution
  3. day57:00:26:34
  4. Oracle优化03-Latch和等待
  5. IE盒模型和标准盒模型
  6. Python 中的 os 模块常见方法
  7. 【DP】【线段树】基站选址(luogu 2605/金牌导航 数据结构优化DP-2)
  8. 什么是CPU密集型、IO密集型?
  9. leetcode 976. 三角形的最大周长
  10. JS高级——Proxy、Reflect
  11. lombok依赖_使用Lombok 前你需要知道这些
  12. html文档加载,html加载
  13. flutter开发仿抖音首页面上下滑动切换播放视频效果
  14. iOS底层探索之多线程(十八)——锁篇章的完结篇(手把手两种方式带你实现一个读写锁!)
  15. 从dist到es:发一个NPM库,我蜕了一层皮
  16. mysql安装包msi_【MySQL】MySQL之MySQL5.7安装包(msi文件)在Windows8下安装
  17. 原生JS自定义6位数密码框
  18. 本Blog被http://www.dotnetnukeblogs.com/ 收录
  19. UI5-Fiori初学者导航
  20. PsTools 的使用方法 psexec是一个远程执行工具,你可以像使用telnet一样使用它。...

热门文章

  1. Glide 这样用,更省内存
  2. 20170623_oracle基础知识_常见问题
  3. Linux常用命令--echo
  4. ubuntu 突然不能 sudo成功,报错su: Authentication failure
  5. Java多线程面试题
  6. 【读书笔记《Android游戏编程之从零开始》】17.游戏开发基础(游戏适屏的简述和作用、让游戏主角动起来)...
  7. [Java] 字符串
  8. 网络工程师专业词汇解释(路由器)
  9. 搜索引擎学习资源收集
  10. 通俗解释AWS云服务每个组件的作用