【XR806开发板试用】SPI驱动数码管显示

准备工作

安装repo
  • 创建repo安装目录。

    mkdir ~/bin
    
  • 下载repo

    wget https://storage.googleapis.com/git-repo-downloads/repo -P ~/bin/
    
  • 改变执行权限

    chmod a+x ~/bin/repo
    
  • 设置环境变量,在~/.bashrc文件的最后输入

    export PATH=~/bin:$PATH和export REPO_URL=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/
    
  • 重启shell

代码下载

#mkdir xr806_openharmony
#cd xr806_openharmony
#repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony_1.0.1_release --no-repo-verify
#repo sync -c
#repo forall -c 'git lfs pull'   #下载部分大容量二进制文件

下载xr806源码

从https://gitee.com/moldy-potato-chips/devboard_device_allwinner_xr806 下载device仓内容。
从https://gitee.com/moldy-potato-chips/devboard_vendor_allwinner_xr806 下载vendor仓内容。
目录结构

device仓目录

device/xradio/xr806
├── adapter				# OpenHarmony接口适配
├── BUILD.gn			# GN构建脚本
├── build.sh			# 启动编译脚本
├── doc					# 指导文档
├── libcopy.py			# SDK编译脚本
├── liteos_m			# 编译工具,编译选项定义
├── os					# liteos接口适配
├── target_config.h		# liteos系统裁剪
└── xr_skylark			# SDK平台相关文件(内核驱动)

vendor仓目录

vendor/xradio
├── LICENSE
├── README.md
└── xr806

环境配置

安装必要的库和工具
sudo apt-get install build-essential gcc g++ make zlib* libffi-dev e2fsprogs pkg-config flex bison perl bc openssl libssl-dev libelf-dev libc6-dev-amd64 binutils binutils-dev libdwarf-dev u-boot-tools mtd-utils gcc-arm-linux-gnueabi cpio device-tree-compiler
安装Python3
python3 --version
sudo apt-get install python3.8
sudo apt update && sudo apt install software-properties-common

安装hb

python3 -m pip install --user ohos-build
vim ~/.bashrc
export PATH=~/.local/bin:$PATH
source ~/.bashrc

设置编译工具链

编译链工具推荐gcc-arm-none-eabi-10-2020-q4-major。(下载网站:
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads)

修改device/xradio/xr806/liteos_m/config.gni中的board_toolchain_prefix为实际环境下的gcc路径,以存放在tools文件夹下为例。

board_toolchain_prefix = "~/tools/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-"

修改device/xradio/xr806/xr_skylark/gcc.mk中的CC_DIR为实际环境下的gcc路径,以存放在tools文件夹下为例。

CC_DIR := ~/tools/gcc-arm-none-eabi-10-2020-q4-major/bin

工程配置

进入SDK目录。

cd device/xradio/xr806/xr_skylark/

复制配置文件。

cp project/demo/audio_demo/gcc/defconfig .config

使用图形化界面确认配置。

make menuconfig

执行make menuconfig后,按方向键选择save保存后,选择exist退出即可。

清除过程文件。

make build_clean

生成静态库已经自动生成头文件。

make lib -j2

返回根目录编译工程。

返回根目录。

cd - 

选择厂商。

hb set  #回车,并选择wifi_skylark

编译系统,后续文件修改不需要重复配置。

hb build -f

SPI驱动点阵数码管

数码管采用的是MAX7219点阵模块 4合一显示屏模块,购买链接:https://item.taobao.com/item.htm?spm=a1z09.2.0.0.6fd52e8dlTXLdZ&id=534578656397&_u=nkiuie8f98

引脚连接

1.VCC  ---   VCC
2.GND  ---   GND
3.DIN  ---   PB04
4.CS   ---   PB06
5.CLK  ---   PB07

main.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "ohos_init.h"
#include "driver/chip/hal_gpio.h"
#include "driver/chip/hal_spi.h"
#include "kernel/os/os.h"
#include "wifi_device.h"/* GPIO */
#define GPIO_OUTPUT_PORT             GPIO_PORT_A/* spi */
#define DEMO_SPI_MCLK                (48 * 1000 * 1000)
#define DEMO_SPI_CS_LEVEL            0
#define DEMO_SPI_PORT                SPI0
#define DEMO_SPI_CS                  SPI_TCTRL_SS_SEL_SS0static OS_Thread_t g_led_thread;
static OS_Thread_t g_spi_thread1;
static OS_Thread_t g_spi_thread2;static void gpio_output_init(void)
{GPIO_InitParam param;param.driving = GPIO_DRIVING_LEVEL_1;param.mode = GPIOx_Pn_F1_OUTPUT;param.pull = GPIO_PULL_NONE;HAL_GPIO_Init(GPIO_OUTPUT_PORT, GPIO_PIN_21, &param);   //led灯对应IO
}/** buf按十六进制输出*/
static void hexdump(unsigned char *buf, unsigned int num)
{unsigned int i = 0;for (; i < num; i++){printf("%02X ", buf[i]);if ((i + 1) % 5 == 0)printf("\n");}printf("\r\n");
}static void gpio_output_ctl(uint8_t level)
{HAL_GPIO_WritePin(GPIO_OUTPUT_PORT, GPIO_PIN_21, level ? GPIO_PIN_HIGH : GPIO_PIN_LOW);
}static int spi_init(void)
{SPI_Config spi_Config;HAL_Status ret = HAL_OK;SPI_Global_Config spi_param;spi_param.cs_level = DEMO_SPI_CS_LEVEL;spi_param.mclk = DEMO_SPI_MCLK;HAL_SPI_Init(DEMO_SPI_PORT, &spi_param);spi_Config.firstBit = SPI_TCTRL_FBS_MSB;spi_Config.mode = SPI_CTRL_MODE_MASTER;spi_Config.opMode = SPI_OPERATION_MODE_POLL;spi_Config.sclk = 4000000;spi_Config.sclkMode = SPI_SCLK_Mode0;printf("spi init...\n");ret = HAL_SPI_Open(DEMO_SPI_PORT, DEMO_SPI_CS, &spi_Config, 5000);if (ret != HAL_OK){printf("spi open failed");return ret;}HAL_SPI_Config(DEMO_SPI_PORT, SPI_ATTRIBUTION_IO_MODE, SPI_IO_MODE_NORMAL);HAL_SPI_CS(DEMO_SPI_PORT, 1);return ret;
}static int spi_deinit(void)
{HAL_Status ret = HAL_OK;printf("spi deinit...\n");HAL_SPI_CS(DEMO_SPI_PORT, 0);HAL_SPI_Close(DEMO_SPI_PORT);return ret;
}static void LedThread(void *arg)
{gpio_output_init();while(1){gpio_output_ctl(1);OS_Sleep(1);gpio_output_ctl(0);OS_Sleep(1);}
}static void SpiThread1(void *arg)
{HAL_Status ret = HAL_OK;uint8_t cmd[] = {0xFF, 0x11, 0x22, 0x33, 0x00};uint8_t data[5];printf("spi demo started.\n");if (HAL_OK != spi_init()){printf("spi init failed.\n");return;}while(1){cmd[4] += 1;printf("spi write...\n");ret = HAL_SPI_TransmitReceive(DEMO_SPI_PORT, cmd, data, 5);if (ret != HAL_OK){printf("spi write failed");}printf("spi read...\n");hexdump(data,5);OS_Sleep(1);}if (HAL_OK != spi_deinit()){printf("spi deinit failed.\n");return;}
}unsigned char disp1[20][8]=
{
#if 0{0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},  //0{0x10,0x30,0x50,0x10,0x10,0x10,0x10,0x38},  //1{0x7E,0x2,0x2,0x7E,0x40,0x40,0x40,0x7E},    //2{0x3E,0x2,0x2,0x3E,0x2,0x2,0x3E,0x0},       //3{0x8,0x18,0x28,0x48,0xFE,0x8,0x8,0x00},     //4{0x0,0x3C,0x20,0x20,0x3C,0x4,0x4,0x3C},     //5{0x0,0x3C,0x20,0x20,0x3C,0x24,0x24,0x3C},   //6{0x0,0x3E,0x22,0x4, 0x8, 0x8, 0x8, 0x8},    //7{0x0,0x3E,0x22,0x22,0x3E,0x22,0x22,0x3E},   //8{0x3E,0x22,0x22,0x3E,0x2,0x2,0x3E,0x00},    //9{0x0,0x8,0x14,0x22,0x3E,0x22,0x22,0x22},    //A{0x0,0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C},   //B{0x0,0x3C,0x40,0x40,0x40,0x40,0x40,0x3C},   //C{0x0,0x7C,0x42,0x42,0x42,0x42,0x42,0x7C},   //D{0x7C,0x40,0x40,0x7C,0x40,0x40,0x7c,0x00},  //E{0x00,0x7C,0x40,0x40,0x7C,0x40,0x40,0x40},  //F{0x00,0x3C,0x40,0x40,0x40,0x44,0x44,0x3C},  //G{0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44},  //H{0x00,0x10,0xFE,0x92,0x92,0xFE,0x10,0x10},  //中{0xFE,0xBA,0x92,0xBA,0x92,0x9A,0xBA,0xFE},  //国#else{0x3C,0x40,0x40,0x38,0x04,0x04,0x78,0x00},  //S{0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x00},  //T{0x10,0x10,0x28,0x28,0x38,0x6c,0x44,0x00},  //A{0x78,0x44,0x44,0x78,0x48,0x44,0x42,0x00},  //R
#endif
};#define Max7219_pinCS_Set()     HAL_SPI_CS(DEMO_SPI_PORT, 1)
#define Max7219_pinCS_Clr()     HAL_SPI_CS(DEMO_SPI_PORT, 0);void Write_Max7219_byte(unsigned char data)
{HAL_Status ret = HAL_OK;unsigned char rdata;ret = HAL_SPI_TransmitReceive(DEMO_SPI_PORT, &data, &rdata, 1);if (ret != HAL_OK){printf("spi write failed");}
}void Init_MAX7219(void)
{int i = 0;//译码方式:BCD码Max7219_pinCS_Clr();for(i = 0; i < 4; i++){Write_Max7219_byte(0x09);Write_Max7219_byte(0x00);}Max7219_pinCS_Set();//亮度Max7219_pinCS_Clr();for(i = 0; i < 4; i++){Write_Max7219_byte(0x0a);Write_Max7219_byte(0x03);}Max7219_pinCS_Set();//扫描界限;8个数码管显示Max7219_pinCS_Clr();for(i = 0; i < 4; i++){Write_Max7219_byte(0x0b);Write_Max7219_byte(0x07);}Max7219_pinCS_Set();//掉电模式:0,普通模式:1Max7219_pinCS_Clr();for(i = 0; i < 4; i++){Write_Max7219_byte(0x0c);Write_Max7219_byte(0x01);}Max7219_pinCS_Set();//显示测试:1;测试结束,正常显示:0Max7219_pinCS_Clr();for(i = 0; i < 4; i++){Write_Max7219_byte(0x0f);Write_Max7219_byte(0x00);}Max7219_pinCS_Set();
}static void SpiThread2(void *arg)
{printf("spi demo2 started.\n");int i, j;if (HAL_OK != spi_init()){printf("spi init failed.\n");return;}Init_MAX7219();while(1){for(i = 1; i < 9; i++){Max7219_pinCS_Clr();for(j = 0; j < 4; j++){Write_Max7219_byte(i);                  //写入地址,即数码管编号Write_Max7219_byte(disp1[j][i-1]);      //写入数据,即数码管显示数字}Max7219_pinCS_Set();}OS_Sleep(1);}if (HAL_OK != spi_deinit()){printf("spi deinit failed.\n");return;}
}void SPITestMain(void)
{/*led flash test*/if (OS_ThreadCreate(&g_led_thread, "LedThread", LedThread, NULL,OS_THREAD_PRIO_APP, 2 * 1024) != OS_OK){printf("[ERR] Create LedThread Failed\n");}/*spi send recieve test*//*if (OS_ThreadCreate(&g_spi_thread1, "SpiThread1", SpiThread1, NULL,OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK){printf("[ERR] Create SpiThread Failed\n");}*//*spi led test*/if (OS_ThreadCreate(&g_spi_thread2, "SpiThread2", SpiThread2, NULL,OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK){printf("[ERR] Create SpiThread Failed\n");}}SYS_RUN(SPITestMain);

实验结果

在这里插入图片描述

参考

  1. https://aijishu.com/a/1060000000288328
  2. https://aijishu.com/a/1060000000256653
  3. https://aijishu.com/a/1060000000256631

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/8833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式光纤测温DTS的测温范围是多少?

分布式光纤测温DTS的测温范围不仅仅取决于光缆的感温能力&#xff0c;还受到多种复杂因素的影响。尽管高温光缆可以耐高温&#xff0c;低温光缆可以耐低温&#xff0c;甚至镀金光缆能够耐受高达700摄氏度的极高温度&#xff0c;然而&#xff0c;这些因素并不能完全解释测温范围…

Jmeter性能测试(六)

一、查询数据库进行参数化步骤 1、添加并配置JDBC Connection Configuration 2、添加并配置JDBC Request 3、添加并配置循环控制器组件 4、添加并配置计数器组件(控制循环中的变量取值) 5、通过函数助手生成引用变量名 6、引用变量进行参数化 二、添加配置JDBC Connection Co…

3万字长文看懂Django面试

目录 Django框架的核心设计哲学是什么? 解释Django中的MTV模式与MVC模式的区别。

zookeeper启动后占用8080端口问题分析及解决

ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务。它为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。 我们经常在运行zookeeper服务时&#xff0c;不需要配置服务端口&#xff0c;…

MySQL 性能模式 performance_schema

文章目录 前言1. 性能模式特点2. 开启性能模式3. 性能模式表分类3.1 采集设置表3.2 实例信息表3.3 等待事件记录表3.4 阶段性事件记录表3.5 语句事件记录表 后记 前言 performance_schema 是 MySQL 提供的一个较为底层的监控&#xff0c;它可以监控数据库中每个线程的所有动作…

运用分支结构与循环结构写一个猜拳小游戏

下面我们运用平常所学的知识来写一个小游戏&#xff0c;这样能够加强我们学习的趣味性&#xff0c;并且能够更加的巩固我们所学的知识。 游戏代码&#xff1a; 直接放代码&#xff1a;&#xff08;手势可以使用数字来代替&#xff0c;比如0对应石头&#xff0c;1对应剪刀&…

【Linux第四课 - git、gdb】git仓库的使用、dgb代码调试

目录 一 、gitgit、gitee、github的理解Linux中git的使用提交删除 二 、gdb - 调试工具进入gdb版本gdb开始调试123、范围查找 一 、git 在linux中使用 分支管理、多人协作 git、gitee、github的理解 git是版本控制工具&#xff0c;gitee和github是网站 Linux中git的使用 提…

编程入门(六)【Linux系统基础操作四】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;if else条件控制基本的if语句带else的if语句嵌…

rancher 证书过期网页进不去 问题解决

参考文章&#xff1a;https://docs.rancher.cn/docs/rancher2.5/cluster-admin/certificate-rotation/_index/#%E6%A6%82%E8%BF%B0 一、问题故障描述&#xff1a; 查看 rancher 容器 日志 docker logs --tail 100 dfc1ef8e4f29提示以下信息&#xff1a; 2024/05/07 08:49:5…

Jmeter性能测试(四)

一、遇到问题解决思路 1、检查请求头是否正确 2、检查请求参数是否正确 3、检查鉴权信息是否正确 4、检查变量作用域 5、检查数据提取是否正确(正则/json提取器) 二、请求头检查 1、在Http信息头管理器查看 2、注意这里的变量作用域是全局的 三、请求参数检查 1、在查看结…

硬件知识积累 音频插座的了解,看音频插座的原理图来了解音频插座的引脚。

1. 音频接口 音频插座是一种用于连接音频信号线路的电子元件&#xff0c;常见于音频设备&#xff08;如音响、耳机、话筒等&#xff09;中。它的主要作用是将电子信号转化为声音信号&#xff0c;以满足人们对于音乐、电影、游戏等方面的需求。 根据插头形状的不同&#xff0c;音…

萤瓴优选:短视频带货新风口,普通人不可错过的黄金赛道!

随着电商行业的快速发展&#xff0c;短视频带货成为了现代营销中的一股新势力。在这个激烈竞争的市场环境中&#xff0c;如何找准一个适合自己的发展方向成为了很多人的关注焦点。2024年起&#xff0c;萤瓴优选应运而生&#xff0c;打造出了一个让普通人也能参与其中的短视频带…

Linux设置open files

临时设置 ulimit -n 1025 查看是否成功 ulimit -n 永久设置&#xff0c;网上很多说添加* soft nofile 65535 * hard nofile 65535但设置后不生效 vim /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535 然后重新…

使用 Parallels Desktop 在 Mac 上畅玩 PC 游戏

我们不再需要接受 “Mac 不是为游戏而打造” 这一事实&#xff1b;Parallels Desktop 通过将电脑变成高性能的游戏设备&#xff0c;从而改变了一切。 Parallels Desktop 充分利用 Mac 硬件的强大功能&#xff0c;让您无缝畅玩 Windows 专享游戏。 性能得到提升&#xff0c;可玩…

##09 深入理解多层感知机(MLP):设计和训练一个MLP模型进行分类任务

文章目录 前言1. 多层感知机(MLP)基本概念1.1 工作原理1.2 激活函数2. 使用PyTorch构建MLP2.1 定义网络结构2.2 数据准备2.3 训练模型3. 实战演示:使用MLP进行手写数字分类3.1 模型评估4. MLP模型的调优和性能提升策略前言 多层感知机(MLP)是神经网络研究和应用中的基础模…

软件测试开发之-基于需求文档、设计文档、测试用例的测试答疑助手

本文将基于 LangChain 实现一个 mini 的实战案例。这次实战主要完成的任务&#xff0c;就是设计一个测试答疑助手&#xff0c;这个测试答疑助手的主要功能为基于本地的文档和数据&#xff0c;回答给出的自然语言问题&#xff0c;比如一些数据的统计&#xff0c;查找、组合。 示…

二总线,替代传统485总线通讯,主动上报方案简易实现方法

二总线通信设计专栏 《二总线&#xff0c;替代传统485总线通讯&#xff0c;选型及应用-CSDN博客》《二总线&#xff0c;替代传统485总线通讯&#xff0c;低成本直流载波方案实现及原理-CSDN博客》《二总线&#xff0c;替代传统485总线通讯&#xff0c;调试避坑指南之最大的电流…

【大数据】分布式数据库HBase下载安装教程

目录 1.下载安装 2.配置 2.1.启动hadoop 2.2.单机模式 2.3.伪分布式集群 1.下载安装 HBase和Hadoop之间有版本对应关系&#xff0c;之前用的hadoop是3.1.3&#xff0c;选择的HBase的版本是2.2.X。 下载地址&#xff1a; Index of /dist/hbase 配置环境变量&#xff1a…

基于单片机的烟雾报警系统的设计与实现

摘要:使用MQ&#xff0d;2 型半导体可燃气体烟雾传感器来监测烟雾浓度&#xff0c;通过STC89C52 单片机处理信号并传递到声光报警电路&#xff0c;达到预警及报警的效果。单片机和烟雾传感器是设计的重点模块&#xff0c;决定了整个报警器的灵敏度和实用价值。设计的报警系统主…

CentOS 7 :虚拟机网络环境配置+ 安装gcc(新手进)

虚拟机安装完centos的系统却发现无法正常联网&#xff0c;咋破&#xff01; 几个简单的步骤&#xff1a; 一、检查和设置虚拟机网络适配器 这里笔者使用的桥接模式&#xff0c;朋友们可以有不同的选项设置 二、查看宿主机的网络 以笔者的为例&#xff0c;宿主机采用wlan上网模…