【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…

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

下面我们运用平常所学的知识来写一个小游戏&#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语句嵌…

Jmeter性能测试(四)

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

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

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

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

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

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

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

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

本文将基于 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…

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

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

一个圈圈的机制玩法

什么是一个圈圈&#xff0c;说白了就是一个撸广告的平台&#xff0c;只是引入了减产机制&#xff0c;九维机制和分成机制&#xff0c;再加上有央企背景&#xff0c;做的一个区块链平台。 玩法很简单&#xff0c;就是撸广告获取能量&#xff0c;然后获取绿色能量&#xff0c;等…

【matlab基础知识代码】(十三)矩阵的相似变换与三角分解矩阵的Jordan 变换与奇异值分解

Cholesky分解 - 知乎 (zhihu.com)&#xff08;之前学习牛顿法有涉及到Cholesky的相关证明&#xff09; Cholesky分解是一种将一个对称正定矩阵分解为一个下三角矩阵和其转置的乘积的方法。简单来讲&#xff0c;就是将一个矩阵分解为一个下三角矩阵和其转置矩阵相乘的结果。 C…

招聘招商求职系统asp.net+sqlserver

招聘招商求职系统asp.netsqlserver 首 页 招聘信息 公寓信息 物品求购 发布信息 管理员后台登陆 账号密码TSoft 111 审核 招聘信息 求职信息 培训信息 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql s…

【密评】 | 商用密码应用安全性评估从业人员考核题库(6/58)

根据Kerckhoffs原则&#xff0c;密码系统的安全性主要依赖于&#xff08;&#xff09;。 A. 密钥 B. 加密算法 C. 解密算法 D. 通信双方 2000年10月&#xff0c;美国NIST宣布&#xff08;&#xff09;算法作为新的高级加密标准AES。 A. Rijndael B. RC6 C. SERPENT D. Twofish…

HackMyVM-VivifyTech

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 wpscan feroxbuster hydra 提权 系统信息收集 横向渗透 git提权 get root 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 08:00:27:9d:6d:7b, …

HTTP 请求走私漏洞

漏洞介绍 http请求走私漏洞&#xff0c;一句话概括就是像走私饭一样&#xff0c;在一个http请求包中携带着另一个请求包或者是多个。在前端看来这是一个请求包很正常的请求包&#xff0c;但是如果来到了后端处理&#xff0c;就会被解析成多个请求包。最终就会导致没有授权而访问…

学习Uni-app开发小程序Day3

经过五一长假&#xff0c;回过头在去看学习的东西&#xff0c;发现仍然是一筹莫展的&#xff0c;看来&#xff0c;学习是不能松懈的&#xff0c;得&#xff0c;自己在把以前的从头复习一遍&#xff0c;加深印象。今天在继续听课&#xff0c;但是出现一个问题&#xff0c;是黑码…