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

static 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,普通模式:1
    Max7219_pinCS_Clr();
    for(i = 0; i < 4; i++)
    {
        Write_Max7219_byte(0x0c);
        Write_Max7219_byte(0x01);
    }
    Max7219_pinCS_Set();
    //显示测试:1;测试结束,正常显示:0
    Max7219_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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32平衡车-MPU6050的DMP库移植

本文目录 一、硬件接线二、需要移植的三个文件夹1. DMP文件夹目录2. IIC文件夹目录3. MPU6050文件夹目录 三、文件内容IO12C.cIO12C.hMPU6050.cMPU6050.hmain.c 四、附录1.更改IIC引脚 一、硬件接线 SCL-- PA11 SDA-- PA12 VCC-- 3.3v GND-- GND 二、需要移植的三个文件夹 1.…

java-串口通讯-连接硬件

串口通信&#xff08;Serial Communications&#xff09;的概念非常简单&#xff0c;串口按位&#xff08;bit&#xff09;发送和接收字节。尽管比按字节&#xff08;byte&#xff09;的并行通信慢&#xff0c;但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很…

短视频矩阵系统源码saas开发--可视化剪辑、矩阵托管、多功能合一开发

短视频矩阵系统源码saas开发&#xff08;可视化剪辑、矩阵托管、智能私信聚合、线索转化、数据看板、seo关键词、子账号等多个板块开发&#xff09; 短视频矩阵系统是一种集成了多种功能的系统&#xff0c;旨在帮助用户在短视频平台上进行高效的内容创作、管理和发布。根据您提…

citylava:城市场景中VLMs的有效微调

citylava:城市场景中VLMs的有效微调 摘要IntroductionRelated WorkVision-Language ModelsVLMs in Driving Methodology CityLLaVA: Efficient Fine-Tuning for VLMs in City Scenario 摘要 在城市广阔且动态的场景中&#xff0c;交通安全描述与分析在从保险检查到事故预防的各…

Type C USB

参考内容地址 https://m.elecfans.com/article/2315364.html Type C是高速 USB3.0设备&#xff0c;不能有大电容在链路中。

【接地故障保护】剩余电流继电器及监控产品解决方案

安科瑞电气股份有限公司 祁洁 15000363176 一、产品型号 二、产品功能 1、对直接接触电击事故的防护 对直接接触电击事故的防护中&#xff0c;剩余电流继电器&#xff08;RCD&#xff09;只作为直接接触电击事故基本防护措施的补充保护措施&#xff08;不包括对相与相、相…

微信小程序音频怎么保存到手机

如果你想在微信小程序中收听美妙的音乐&#xff0c;又想将其保存到手机中&#xff0c;那么微信小程序音频怎么保存到手机这个问题就是你的最佳指南。 微信小程序音频下载工具我已经打包好了&#xff0c;有需要的自己下载一下 下载高手工具打包链接&#xff1a;百度网盘 请输入…

【Git】Git在Gitee上的基本操作指南

文章目录 1. 查看 git 版本2. 从Gitee克隆仓库&#xff1a;3. 复制文件到工作目录&#xff1a;4. 将未跟踪的文件添加到暂存区&#xff1a;5. 在本地提交更改&#xff1a;6. 将更改推送到远程仓库&#xff08;Gitee&#xff09;&#xff1a;7. Windows特定提示&#xff1a; 1. …

sh包装脚本

两个脚本,运行的时间间隔分别是一分钟和五分钟,放入到sh文件中,挂在后代,脚本里面的路径最好是绝对路径。 新建sh文件 新建 run_test.sh 文件,使其可以运行两个不同的 Python 脚本,一个每分钟运行一次,另一个每五分钟运行一次。下面是修改后的 run_test.sh 文件的示例:…

DOTA-Gly-Asp-Tyr-Met-Gly-Trp-Met-Asp-Phe-NH2,1306310-00-8,是一种重要的多肽化合物

一、试剂信息 名称&#xff1a;DOTA-Gly-Asp-Tyr-Met-Gly-Trp-Met-Asp-Phe-NH2CAS号&#xff1a;1306310-00-8结构式&#xff1a; 二、试剂内容 DOTA-Gly-Asp-Tyr-Met-Gly-Trp-Met-Asp-Phe-NH2是一种重要的多肽化合物&#xff0c;其CAS号为1306310-00-8。该多肽包含一个DO…

idea配置hive

idea配置hive 今天才知道&#xff0c;idea居然可以配置hive&#xff0c;步骤如下: view -> Tool Windows -> Database Database出来了之后&#xff0c;直接配置即可

STM32快速入门(定时器之输入捕获)

STM32快速入门&#xff08;定时器之输入捕获&#xff09; 前言 本节主要讲解STM32利用通用定时器&#xff0c;在输入引脚出现指定电平跳变时&#xff0c;将CNT的值锁存到CCR寄存器当中&#xff0c;从而计算PWM波形的频率、占空比、脉冲间隔、电平持续时间等。其功能的应用有&…

[C++基础编程]----预处理指令简介、typedef关键字和#define预处理指令之间的区别

目录 引言 正文 01-预处理指令简介 02-typedef关键字简介 03-#define预处理指令简介 04-#define预处理指令和typedef关键字的区别 &#xff08;1&#xff09;原理不同 &#xff08;2&#xff09;功能不同 &#xf…

【YOLOv8改进[Backbone]】使用SCINet改进YOLOv8在黑暗环境的目标检测效果

目录 一 SCINet 1 本文方法 ① 权重共享的照明学习 ② 自校准模块 ③ 无监督训练损失 二 使用SCINet助力YOLOv8在黑暗环境的目标检测效果 1 整体修改 2 配置文件 3 训练 其他 一 SCINet 官方论文地址&#xff1a;https://arxiv.org/pdf/2204.10137 官方代码地址&…

26_Scala集合常用API汇总

文章目录 1.mkString2.size&#xff0c;length&#xff0c;isEmpty,contains3.reverse ,length,distinct4.获取数据相关4.1数据准备4.2准确获取尾部last4.3 除了最后一个元素不要其他都要4.4从集合获取部分数据 5.删除数据5.1删除3个从左边5.2删除3个右边 6.切分数据splitAt(n:…

解决“您的连接不是私密连接”

目录 那么为什么会出现这样提示呢 https访问有什么不同 将http访问更改为https访问 当您在浏览网页时&#xff0c;遇到“您的连接不是私密连接”的提示&#xff0c;这通常表示浏览器认为您的连接不够安全。这是因为浏览器无法信任网站使用的SSL证书&#xff0c;或者网站没有…

【系统架构师】-UML-用例图(Use Case)

1、概述 用于表示系统功能需求&#xff0c;以及应用程序与用户或者与其他应用程序之间的交互关系。 2、组成 参与者&#xff08;Actors&#xff09;&#xff1a;与系统交互的用户或其他系统。用一个人形图标表示。用例&#xff08;Use Cases&#xff09;&#xff1a;系统需要…

平滑矢量图形综述:表示、创建、光栅化和图像矢量化的最新进展

摘要 平滑矢量图形领域探索了轻量级图像表示的表示、创建、光栅化和自动生成&#xff0c;常用于可缩放图像内容。过去几十年中&#xff0c;出现了多种概念性方法来表示具有平滑渐变的图像&#xff0c;每种方法都引发了独立的研究线索&#xff0c;包括流行的梯度网格和扩散曲线…

工程技术SCI期刊,中科院三区,一投就中,国人友刊!

一、期刊名称 Industrial Management & Data Systems 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;工程技术 影响因子&#xff1a;5.5 中科院分区&#xff1a;3区 出版方式&#xff1a;订阅模式/开放出版 版面费&#xff1a;$4120 三、期刊征稿范…

QT功能 实现静态内容国际化实验

文章目录 第一步&#xff1a;新建一个QT工程第二步&#xff1a;添加控件第三步&#xff1a;在pro文件中添加内容第四步&#xff1a;更新文件第五步&#xff1a;打开QT的Linguist第六步&#xff1a;添加翻译内容第七步&#xff1a;回到QT Creator中添加文件第八步&#xff1a;给…