【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://xiahunao.cn/news/3019239.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

java项目+maven+sonarqube+githook 实现代码提交审查

java项目mavensonarqubegithook 实现代码提交审查 当在团队开发过程中, 由于开发人员技术和风格的不同,导致代码质量和风格各不相同, 为了减少合并时的工作量, 以及基础的一些bug 的避免, 可以使用 (sonarqube阿里巴巴开发规范) 实现代码质量的检测. 为了更加简便, 即在使用git…

武汉星起航:亚马逊年终促销新策略——强化营销,优化体验赢未来

年终节日是电商平台的黄金销售期&#xff0c;也是各大电商平台竞相展示自身实力与智慧的重要舞台。作为全球电商巨头的亚马逊&#xff0c;自然也不例外。每年的年终节日&#xff0c;亚马逊都会推出一系列精彩纷呈的促销活动&#xff0c;吸引全球消费者的目光&#xff0c;实现销…

终端安全管理措施有哪些?好用终端安全管理软件推荐(建议收藏)

在当今数字化时代&#xff0c;信息安全已成为企业运营不可或缺的一部分。其中&#xff0c;终端安全为您详细介绍&#xff0c;并推荐几款好用的终端安全管理软件&#xff0c;帮助您更好地保护企业信息安全。管理是确保企业信息安全的重要环节。那么&#xff0c;终端安全管理措施…

JAVA智慧校园平台系统源码:基于前后端框架VUE2+Spring boot+Wed端原生小程序搭建的智慧校园平台

智慧校园平台是目前教育信息化领域的热点之一。随着数字化转型的加速&#xff0c;越来越多的学校开始寻求解决方案&#xff0c;以提高教育管理的效率和质量。 在使用智慧校园平台的过程中&#xff0c;一些功能特点是必要的。那么&#xff0c;究竟什么是智慧校园平台&#xff1…

[图解]SysML和EA建模住宅安全系统-02

1 00:00:00,900 --> 00:00:02,690 这个就是一个块定义图了 2 00:00:03,790 --> 00:00:04,780 简称BDD 3 00:00:05,610 --> 00:00:08,070 实际上就是UML里面的类图 4 00:00:08,080 --> 00:00:09,950 和组件图的一个结合体 5 00:00:13,150 --> 00:00:14,690 我…

C++-9

C 1.已知C风格的字符串&#xff0c;完成对字符串通过下标访问时的异常处理机制(越界访问) 2.写一个程序&#xff0c;程序包含两个类&#xff0c;类中实现一个成员函数&#xff0c;MyGetChar(), 类A中每调用一 次&#xff0c;按顺序得到一个数字字符&#xff0c;比如第-次调用得…

哪个品牌的开放式耳机好用?五款畅销拔尖爆款力荐!

在耳机市场上&#xff0c;开放式耳机正逐渐成为一股新的风潮。它们以其独特的设计和卓越的音质吸引着越来越多的耳机爱好者。相较于传统的蓝牙耳机&#xff0c;开放式耳机不仅在音质上更胜一筹&#xff0c;更在佩戴舒适度上取得了显著突破。传统的蓝牙耳机&#xff0c;由于多采…

LeetCode746:使用最小花费爬楼梯

题目描述 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 代码 …

C/C++ BM33 二叉树的镜像

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 总结 前言 镜像说的好听&#xff0c;无非就是换下节点。 题目 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。 数据范围&#xff1a;二叉树的节点数 0 ≤ n ≤ 1000 0≤n≤1000 0≤n≤1000&#xff0c; 二叉树每…

AIGC实战——多模态模型DALL.E 2

AIGC实战——多模态模型DALL.E 2 0. 前言1. 模型架构2. 文本编码器3. CLIP4. 先验模型4.1 自回归先验模型4.2 扩散先验模型 5. 解码器5.1 GLIDE5.2 上采样器 6. DALL.E 2 应用6.1 图像变体6.2 先验模型的重要性6.3 DALL.E 2 限制 小结系列链接 0. 前言 DALL.E 2 是 OpenAI 设计…

Apache Knox 2.0.0使用

目录 介绍 使用 gateway-site.xml users.ldif my_hdfs.xml my_yarn.xml 其它 介绍 The Apache Knox Gateway is a system that provides a single point of authentication and access for Apache Hadoop services in a cluster. The goal is to simplify Hadoop securit…

深圳比创达电子|EMI一站式解决方案:提升企业电磁兼容性的路径

随着电子技术的快速发展&#xff0c;电磁干扰&#xff08;EMI&#xff09;问题日益凸显&#xff0c;对电子设备的正常运行和性能稳定造成了严重影响。为了有效应对这一挑战&#xff0c;EMI一站式解决方案应运而生&#xff0c;成为众多企业和个人解决EMI问题的首选方案。 一、E…

2. 外婆都称赞的基于Jaeger的Span模型改造

前言 我们的目标是基于Jaeger来实现分布式链路追踪的Java客户端工具包&#xff0c;实际就是一个Springboot的Starter&#xff0c;在1. 看完这篇文章我奶奶都懂Opentracing了一文中我们详细的学习了一下Opentracing的相关概念以及阅读了相关的源码&#xff0c;同时特别重要的是…

HOOPS Visualize:工业级3D可视化SDK,打造移动端和PC端工程应用程序

HOOPS Visualize是一种高性能的软件开发工具包&#xff08;SDK&#xff09;&#xff0c;旨在帮助开发人员轻松构建和集成高质量的3D可视化功能。这是一种全功能的&#xff0c;以工程为重点的场景图技术&#xff0c;我们称为Core Graphics。Core Graphics可集成到一个框架中&…

将 Vue、React、Angular、HTML 等一键打包成 macOS 和 Windows 平台客户端应用

应用简介 PPX 基于 pywebview 和 PyInstaller 框架&#xff0c;构建 macOS 和 Windows 平台的客户端。本应用的视图层支持 Vue、React、Angular、HTML 中的任意一种&#xff0c;业务层支持 Python 脚本。考虑到某些生物计算场景数据量大&#xff0c;数据私密&#xff0c;因此将…

Quartz怎么简单创建一个定时执行的任务

1.安装Quartz包 2.编写Job任务 继承 IJob编辑自定义任务 3.调用job&#xff0c;以指定时间策略执行 定时600s执行一次 StdSchedulerFactory factory new StdSchedulerFactory(); IScheduler scheduler await factory.GetScheduler(); await scheduler.Start();// 定义…

AP2305GN 封装SOT23 场效应管

AP2305GN是一款P通道增强型功率MOSFET&#xff0c;适用于多种电子设备和系统中的高频率切换应用。下面是一些可能包含在该器件的功能和参数介绍中的关键点&#xff1a; 封装: AP2305GN通常采用表面安装封装&#xff0c;如SMD或SMT封装&#xff0c;适用于自动化电路板装配。 电…

长难句打卡5.8

If it is trying to upset Google, which relies almost wholly on advertising, it has chosen an indirect method: there is no guarantee that DNT by default will become the norm. 如果它想激怒几乎全靠广告业务运营的谷歌公司的话&#xff0c;那么它选择了一个间接的方…

微软正在自主构建一个名为 MAI-1 的大型语言模型(不依赖 OpenAI)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

C++算法题 - 二叉树(2)

TOC 114. 二叉树展开为链表 LeetCode_link 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与…