CH341 SPI方式烧录BK7231U

2024-01-11 02:28
文章标签 方式 烧录 spi ch341 bk7231u

本文主要是介绍CH341 SPI方式烧录BK7231U,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        CH341是一个USB总线的转接芯片,通过USB总线提供异步串口、打印口、并口以及常用的2线和4线等同步串行接口。

         BK7231U Wi-Fi SOC芯片,内嵌处理器。1. 符合802.11b/g/n 1x1协议    2. 17dBm 输出功率3. 支持20/40 MHz带宽和STBC    4. 支持Wi-Fi STA、AP、Direct模式 5. 支持蓝牙5.1协议,-90dB灵敏度和20dBm输出功率    6. 片内MCU 7. 最高频率120MHz    8. 片内256Kbyte数据RAM 9. 内置2MB FLASH,支持透明下载    10. 6路32位 PWM 11. 多路程序下载与JTAG接口    12. 全速USB主机和设备 13. 50MHz SDIO和SPI接口,并支持主从模式    14. 支持两路I2C接口
15. 支持两路高速UART   16. 6路32位PWM 17. 麦克风信号放大    18. 内置多通道ADC 19. 支持8位DVP 图像传感器    20. 32字节eFUSE

        BEKEN(博通集成)的芯片还是不错的,比如这款BK7231U是对标ESP8266的,并且还有蓝牙功能。但是官方的通用烧写器,价格大约200多,对爱好者来说毫无性价比可言。并且BEKEN的官网什么都没有,数据手册、SDK这些都是给企业用户。个人用户想学习难度不小。

        直到看了这篇https://www.elektroda.com/rtvforum/topic3931424.html用python+ Raspberry Pi实现了对BK7231的烧写。感觉还有点搞头。

        手头没有Raspberry Pi,照搬原作者的方法不太现实。所以做了下变通,就有了后面的方法:

一、硬件连接

        这个C-8133U模块主控是BK7231U,没有模块资料,模块引脚定义是自己测的。

        下面是BK7231U芯片的引脚定义,注意和其他的BK7231,比如BK7231T、BK7231N是不一样的。

        左边是BK7231U,右边是CH341

GND  <------------------->  GND

VBAT/3V3    <---------->   VCC

CEN         <-------------->  D2(GPIO)

P23/MOSI <------------->  MISO

P22/MISO <-------------->  MOSI

P21/CSN <-----------------> CS0

P20/SCK <----------- -----> SCK

二、烧录原理

        BK7231U中存储用户程序的flash是一个25系列的flash,支持SPI读写。但是直接用CH341读写BK7231u是不行的。BK7231U数据手册中关于程序下载有如下描述:

         也就是说,需要在芯片复位后将做模式选择才能使CH341将BK7231U当作一个flash,如果错过了复位后的几百毫秒,BK7231U进入MCU运行模式,就不能烧录的。

三、烧录实现

1、使BK7231U进入SPI烧录模式

import random
import time
import numpy as np
from matplotlib import pyplot as plt
import os
import random
import numpy as np
from fractions import Fraction
import pyautogui
from PIL import Image
import binascii
import struct
import codecs
import binascii## call ch341dll_wrap
from ch341dll_32bits_wrap.ch341dll_wrap  import *#CEN:GPIO02
#
#
def GPIO_CEN_SET():result=ch341dll.CH341Set_D5_D0(hd.usb_id,0x04,0x04)if result==1:print("Set CEN hight success!\r\n")
def GPIO_CEN_CLR():result=ch341dll.CH341Set_D5_D0(hd.usb_id,0x04,0x00)if result==1:print("Set CEN low success!")def ChipReset():# set CEN low for 1sGPIO_CEN_CLR()time.sleep(0.1)GPIO_CEN_SET()def BK_EnterSPIMode(data):send_buf = bytearray(25)for x in range(25):send_buf[x] = datasend_buf=hd.ch341_spi4w_stream(bytes(send_buf))buf1 = bytearray(4)buf1[0]=0x9Fbuf1[1]=0x00buf1[2]=0x00buf1[3]=0x00#buf1=b'\x9F\x00\x00\x00'buf1=hd.ch341_spi4w_stream(bytes(buf1))out1=buf1[0]zeroCount=0;for x in range(1,4):if(buf1[x]==b'\x00'):zeroCount+=1print(buf1.raw)if out1!=b'\x00' and zeroCount==3:return 1return 0hd = CH341DEV(0)
hd.ch341_i2c_speed(3)for x in range(1,11):print('\r\n\r\n\r\n----------------try into BK_SPIMode-----------------------\r\n')print("attemp to make BK7321 into SpiMode , the [",x,"] Times\r\n")ChipReset()ifEnterSpiMode=BK_EnterSPIMode(0xD2)if(ifEnterSpiMode==1):print("\r\nEnter SpiMode success!!!\r\n")breaktime.sleep(1)if ifEnterSpiMode!=1:print("Enter SpiMode failure!!!   let's run againt \r\n")	

       这个PYTHON程序向CH341发送25个0xD2(必须是0xD2,发送多少个好像也没有固定的数量),然后发送了0x9F查询了一些flash的id,这里有点玄学,有几率使BK7231U进入SPI烧录模式。

2、用NeoProgrammer程序烧录bin到BK7231U

        BK7231U进入SPI烧录模式后,打开NeoProgrammer,BK7231U会被NeoProgrammer识别为GD25Q16。选好要烧录的bin文件(bootloader+用户bin打包文件),直接烧录。

四、总结

1、为什么不用PYTHON程序直接把后面下载BIN的步骤都实现了?

        主要是水平有限,只实现了PYTHON使能BK7231U进入SPI模式。

        这个方法可靠性不高,所以轮询了10次,总能成功的,不行就再运行一遍。

2、NeoProgrammer是驱动CH341读写24、25系列FLASH的专用程序,网上比较好找。NeoProgrammer下载flash稳定好用。

3、ch341dll_32bits_wrap.ch341dll_wrap这个依赖可以从这里下载GitHub - jimjiang2/ch341dll_wrap_typical_app: A ch341dll Wrap is for using in Python 32bits windows to access I2C SPI and MDIO (by GPIO), and Demo with display PC sreen on OLED by i2c or SPI .

4、BK7231U有rtt SDK:

GitHub - aozima/bk7231u_rtt_sdk: bk7231u_rtt_sdk

可以通过RTTHREAD env编写自己的固件。生成烧写用的bin,要用bk7231u_rtt_sdk\OTAPackage\beken_packager\beken_packager.exe打包一下,把bootloader打包进去,再用NeoProgrammer烧写。

这篇关于CH341 SPI方式烧录BK7231U的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/592845

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

java读取excel文件为base64实现方式

《java读取excel文件为base64实现方式》文章介绍使用ApachePOI和EasyExcel处理Excel文件并转换为Base64的方法,强调EasyExcel适合大文件且内存占用低,需注意... 目录使用 Apache POI 读取 Excel 并转换为 Base64使用 EasyExcel 处

Spring Boot中获取IOC容器的多种方式

《SpringBoot中获取IOC容器的多种方式》本文主要介绍了SpringBoot中获取IOC容器的多种方式,包括直接注入、实现ApplicationContextAware接口、通过Spring... 目录1. 直接注入ApplicationContext2. 实现ApplicationContextA

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日