【海思】Hi3531A SPI功能的详细配置以及使用

本文介绍了海思3531A平台SPI调试的过程,包括管脚配置、使用海思himm工具及用户态应用程序的编写。通过解决SPI通信异常问题,提供了详细的SPI配置步骤。

一、前言

因为部门的一个负责海思驱动开发的老同事另谋高就了,部门又暂时找不到人来对接他的任务,所以领导就让我这个菜鸟来硬着头皮顶上了。在这我也对这位老同事表示深刻的感谢,在对接的期间,那么耐心教导我,让我这个刚出来社会不久、又没怎么接触过海思平台的菜鸟学习到了很多东西。

回归正题:部门在海思3531A产品调试的时候发现SPI通信不正常,使用示波器发现SPI的CS片选引脚怎么也拉不低,SCLK(时钟)、SDI(数据输入引脚)和SDO(数据输出引脚)的信号也不正常。在我不停地阅读官方资料和询问大神们,最终调好了。

所以接下来,本文章会针对 海思SPI配置的问题 来记录下我调试的整一个过程,包括官方资料的阅读。

二、SPI管脚信息获取

在一个新的平台上面开发,我们首先需要阅读官方的资料,并获取到自己需要的资料。这里主要是针对与 SPI配置 相关的资料查找。

2.1 SPI_SCLK、SPI_SDI、SPI_SDO管脚复用寄存器

因为涉及到SPI的使用(如果不熟悉SPI通信协议的,可以先去搜索了解下先),那就会涉及到管脚的使用,所以我们先找到芯片的管脚信息表,这个管脚信息表一般芯片平台的官方资料里面都会有,而且一般都会放在硬件的目录下。海思平台的管脚信息表的路径是 00.hardware\chip\document_cn\HI3531AV100_PINOUT_CN.xlsx ,打开可以看到这个表格有很多页,这些页的内容包括管脚的功能/复用功能、默认值、特性以及管脚复用寄存器等信息。

我们在HI3531AV100_PINOUT_CN.xlsx这个表格的《1.管脚信息表》页找到SPI管脚。

  • 《1.管脚信息表》页列说明:
Pin Num Pin Name Voltage(V) Default IO Type Mux Control Register Name Drive&Slew Control Register Name Function n
管脚号 管脚名称 管脚输入或输出的高/低电平 默认的管脚是输入/输出高还是低等。 IO口的类型 复用寄存器名称,有的话就代表该管脚有复用功能。如果不是硬件复用可在《3.管脚复用寄存器》页查找该名称,可以看到该管脚的复用寄存器地址以及功能描述;如果是硬件复用,则可以在《5.硬件复用关系》页查找到。 这是管脚的驱动能力寄存器,可在《4.管脚驱动能力寄存器》页查看。 这是对应管脚的功能描述。
  • 我们可以看到寄存器部分 HI3531AV100_PINOUT_CN.xlsx 表格就只是说了管脚复用的一些寄存器,那么其他管脚的寄存器呢?一般其他的寄存器文档也是会在这个目录下的,海思平台的这个文档是在 00.hardware\chip\document_cn\Hi3531A H.264编解码处理器用户指南.pdf

通过上面管脚信息表,我们发现和SPi相关的有7个管脚,而且都是复用管脚,其中四个是片选管脚,其他则是SPi的时钟(SPI_SCLK)、数据输入(SPI_SDI)、数据输出(SPI_SDO)管脚。我们需要使用SPI的功能,那么就需要正确配置每个引脚。

接下来我们先根据上面的复用管脚的复用寄存器名称,到《3.管脚复用寄存器》页或者《5.硬件复用关系》页里面找:

  1. 片选管脚SPI_CSN0-SPI_CSN3:

片选管脚是硬件复用的,这一般不需要软件来进行配置,需要硬件工程师来配合。通过个人的调试经验来说,需要用到的的片选管脚硬件上不要接上拉电阻或者下拉电阻,否则海思芯片有可能会无法控制该片选管脚。

  1. SPI_SCLK、SPI_SDI、SPI_SDO管脚复用寄存器:

通过上图得知,SPI_SCLK、SPI_SDI、SPI_SDO管脚的默认值都不是和SPI通信相关的,所以我们需要配置这些管脚为SPI功能,也就是要往寄存器写0x01的值。

2.2 片选SPI_CSN0-SPI_CSN3管脚寄存器

在HI3531AV100_PINOUT_CN.xlsx 表格中,SPI_SCLK、SPI_SDI、SPI_SDO管脚的寄存器的地址和值都找到了,但是片选管脚的寄存器呢?不在这个表格,那就是在上面提到的 00.hardware\chip\document_cn\Hi3531A H.264编解码处理器用户指南.pdf 文档中了。打开文档,我们发现该片选的寄存器是在 3.系统/3.5.系统控制器/3.5.5.外设控制寄存器 的目录中,是外设功能选择寄存器2(MISC_CTRL5)控制的片选:

  • 外设控制寄存器概览:

  • MISC_CTRL5寄存器:

这样的话我么就知道片选引脚的寄存器地址是 0x1212 0014、对应的值也可以通过上图MISC_CTRL5寄存器得知了。

三、配置和使能与SPI相关的管脚

到了这里,SPI所有引脚的寄存器地址和对应的值都知道了,那这些应该怎么配置呢?

先不要着急,我们先来打开 01.software\board\document_cn\Hi3531A SDK 安装以及升级使用说明.txt 这个文档(当我们第一次拿到官方SDK的时候就应该看这个来进入着手,里面内容写得不是很详细,但是覆盖面挺大的。01.software\board\document_cn这个目录下的文档都是与软件开发相关的文档),看一下有没有和管脚配置的相关的引导。

可以发现是有说到与管脚配置相关的说明,而且正好是复用管脚的使用。通过以上的文字可知,很有可能我们的相关管脚就是在mpp/ko目录下的sh脚本中配置的,我们到SDK的mpp/ko目录看下sh脚本。其中pinmux_vicap_i2c_i2s.sh脚本的内容如下:

#!/bin/sh

echo "run $0 begin!!!";
#I2C
himm 0x120F01CC 0x1;  # 0:GPIO19_6  01:I2C0_SDA
himm 0x120F01D0 0x1;  # 0:GPIO19_7  01:I2C0_SCL
himm 0x120F0148 0x2;  # 0: GPI13_0   01: SPI_SCLK  2:I2C1_SCL #刚好是SPI_SCLK复用寄存器的地址,这里设置为了I2C1_SCL功能
himm 0x120F014C 0x2;  # 0: TEST_CLK  01: SPI_SDO   2:I2C1_SDA #是SPI_SDO复用寄存器的地址,这里设置为了I2C1_SDA功能

#VICAP
himm 0x120F0000 0x2;
himm 0x120F0024 0x2;
himm 0x120F0048 0x2;  # 0:GPIO21_2  01:VI_ADC_REFCLK0   2:VI1_CLK
himm 0x120F004c 0x2;
himm 0x120F0070 0x2;
himm 0x120F0094 0x2;  # 0:GPIO21_5  01:VI_ADC_REFCLK1   2:VI3_CLK
himm 0x120F0098 0x2;
himm 0x120F00bc 0x2;
himm 0x120F00E0 0x2;  # 0:GPIO12_1  01:VI_ADC_REFCLK2   2:VI5_CLK
himm 0x120F00e4 0x2;
himm 0x120F0108 0x2;
himm 0x120F012C 0x2;  # 0:GPIO20_6  01:VI_ADC_REFCLK3   2:VI7_CLK

#UART
himm 0x120F0200 0x3;   # 0: GPIO18_2  1:VOU_SLV_DAT11   2:UART1_RTSN   3:UART0_RTSN
himm 0x120F0204 0x3;   # 0: GPIO18_3  1
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值