SPI总线知识总结

1 SPI的时钟极性CPOL和时钟相位CPHA的设置
1.1 SPI数据传输位数
SPI传输数据过程中总是先发送或接收高字节数据,每个时钟周期接收器或发送器左移一位数据。对于小于16位的数据,在发送前必须左对齐,如果接收的数据小于16位,则采用软件将无效的数据位屏蔽。

1.2 Linux Example
@ drivers/hwmon/max1111.c
static int max1111_probe(struct spi_device *spi)
{
    enum chips chip = spi_get_device_id(spi)->driver_data;
    struct max1111_data *data;
    int err;

    spi->bits_per_word = 8;
    spi->mode = SPI_MODE_0;  //HERE
    err = spi_setup(spi);
    if (err < 0)
        return err;

    [...]
}

1.3 MCU
@ mems_init.c
spi_config.polarity = HAL_SPI_MASTER_CLOCK_POLARITY0;
spi_config.phase = HAL_SPI_MASTER_CLOCK_PHASE0;

Cywee CMH1000 IC is designed by Realtek, software is designed by Cywee. CMH1000 sensorhub integrates 224KB DRAM and 336KB IRAM, SRAM voltage is 1V.
CMH1000 sensorhub侧DataRAM开始地址保留1024字节,给SPI传输用,分成TX和RX,各512 bytes;sensorhub侧封包最大是269 bytes(包括header和payload)。

2 SD卡SPI模式
2.1 SD卡pin映射到SPI模式
针脚       SD卡模式       SPI模式
1             CD/DAT3         CS
2             CMD                MOSI
3             VSS                 VSS
4             VCC                 VCC
5             CLK                  CLK
6             VSS                  VSS
7             DAT0                MISO
8             DAT1                NC
9             DAT2                NC

2.2 SD命令中的CMD和ACMD的区别
ACMD:Application specific ComManD, which is an application specific command rather than a standard command。
一般的CMD只有6个bit,后来发现需要的CMD类型多了,所以就扩展出了CMD55+ACMDxx的扩展模式。ACMD命令发送前需要先发送CMD55,比如ACMD41,先发送CMD55,再发送ACMD41。

2.3 SD/MMC 初始化流程
1)配置时钟,慢速一般为400K,设置工作模式
2)发送CMD0,进入空闲态,该指令没有反馈
3)发送CMD8,如果有反应,CRC值与发送的值相同,说明该卡兼容SD2.0协议
4)发送CMD55+ACMD41,判断SD卡的上电是否正确,短反馈成功说明该卡为SD卡(短反馈第31位置1为HC卡),否则发送CMD0,有反应说明是MMC卡
5)发送CMD2,验证SD卡是否接入,长反馈CID(Card IDentification Register)
6)发送CMD3,读取SD卡的RCA(地址,Relative Card Address),短反馈
7)发送CMD9,读取CSD(Card Specific Data Register)寄存器获取卡的相关信息
8)发送CMD7,使能SD卡
9)配置高速时钟,准备数据传输,一般20M~25M
10)发送CMD55+ACMD51读取SCR(SD Card Configuration Register)寄存器,SD卡可以通过该值获得位宽,如果是MMC卡则需要使用主线测试来确定卡的位宽
11)SD卡发送CMD55+ACMD6配置为4bit数据传输模式(根据SCR读出来的值确定),MMC卡发送CMD6来设置位宽
12)发送CMD7,使能SD卡,使其进入传输状态,接着发送CMD16设置块大小(根据前面读取的CSD信息确定)
13)把命令参数设置为0,再次发送CMD7,取消选中所有卡

Figure 2-1 SD卡的初始化和识别流程

2.4 Q and A
Q:SD卡的工作频率是根据什么来决定的?
A:目前所知不是通过读取寄存器(可读写寄存器CSD、SCR等)获取的,而是根据SD卡的类型,类型对应着工作频率。
host端配置支持的频率,然后SD卡本身会有支持的频率,两边取都支持的最高频率,所以需要得到SD卡的类型,类型就对应着频率。
in mmc.c
mmc_select_card_type() - 根据卡的类型(仅需要知道卡的类型后)选择工作频率,选择的工作频率不能大于最大工作频率(最大工作频率由CSD寄存器TRAN_SPEED[103:96]字段指定)。

3 SPI接口以太网芯片
WIZnet - 80 MHz SPI slave接口
ENC28J60 - Microchip Ethernet Controller,10 MHz SPI slave
CH395 - SPI slave 30 MHz

QCOM平台使用gpll0去做分频,SPI的速度可以达到100 MHz

BCM89230交换芯片- SPI slave最高速度62.5 MHz,Data Format(Big Endian序):1-byte command, 4-byte address, 1 ~ 8 bytes data

4 APL A39X0 Gen9
4.1 spi-pxa2xx
4.2 ACPI - iasl_win
cat /sys/firmware/acpi/tables/DSDT > DSDT.aml
sudo apt-get install iasl
iasl -d DSDT.aml
cat DSDT.dsl

WINDOWS BINARY TOOLS
https://www.acpica.org/downloads/binary-tools

5 Abbreviations
ACMD: Application specific ComManD
ARC: Argonant RISC Core
AT91SAM9260: SAM means Smart ARM-based
ATMEL SAMBA: ATMEL Smart ARM-based Boot Assistant
DTR: Data Transfer Rate
DWC2:Design Ware Controller 2,Apple的嵌入式设备,包括iPad和iPhone都是使用的DWC2
ISP1161: Philips' Integrated host Solution Pairs 1161,“Firms introduce USB host controllers”,https://www.eetimes.com/document.asp?doc_id=1290054
MISO: mi s əu
MOSI: m əu si
QUP:高通平台的SPI总线和I2C共用core和引脚,称为QUP(QCOM Universal Peripheral);而UART和QUP又共用引脚,并且称为BLSP
SL811HS:Cypress/ScanLogic 811 Host/Slave,性能上与ISP1161(Integrated host Solution Pairs 1161)相当
TDI:TransDimension Inc.,该公司首先发明了将TT集成到EHCI RootHub中的方法,这样对于嵌入式系统来说,就省去了OHCI/UHCI的硬件,同时降低了成本,作为对该公司的纪念,Linux内核定义了宏ehci_is_TDI(ehci)
TLV: TI Low Value,高性价比
TPS: TI Performance Solution

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

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

相关文章

C++基于多设计模式下的同步异步日志系统day7(终)

C基于多设计模式下的同步&异步日志系统day7&#xff08;终&#xff09; &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C基于多设计模式下的同步&异步日志系统 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#…

CAN总线位时序的介绍

CAN控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平&#xff0c;二者必居其一。发送方通过使总线电平发生变化&#xff0c;将消息发送给接收方。 显性电平对应逻辑 0&#xff0c;CAN_H 和 CAN_L 之差为 2.5V 左右。而隐性电平对应逻辑 1&#xff0c…

深入理解现代JavaScript:从语言特性到应用实践

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 JavaScript作为一门动态、解释性脚本语言&…

前端面试题 ===> 【JavaScript - 高级】

公众号&#xff1a;需要以下pdf&#xff0c;关注下方 2023已经过完了&#xff0c;让我们来把今年的面试题统计号&#xff0c;来备战今年的金三银四&#xff01;所以&#xff0c;不管你是社招还是校招&#xff0c;下面这份前端面试工程师高频面试题&#xff0c;请收好。 JavaScr…

步进电机驱动器接法

实物 参数 共阳极&#xff1a; 使能给高电平有效 共阴极&#xff1a; 使能给低电平有效 整体接线 参考内容 B站UP范辉

基于Java SSM springboot+VUE+redis实现的前后端分类版网上商城项目

基于Java SSM springbootVUEredis实现的前后端分类版网上商城项目 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐…

深入理解Lambda表达式:基础概念与实战演练【第114篇—python:Lambda表达式】

深入理解Lambda表达式&#xff1a;基础概念与实战演练 在现代编程语言中&#xff0c;Lambda表达式作为一种轻量级的匿名函数形式&#xff0c;越来越受到程序员的青睐。特别是在函数式编程兴起的今天&#xff0c;Lambda表达式在简化代码、提高可读性方面发挥着重要作用。本文将…

【Web】浅浅地聊JDBC java.sql.Driver的SPI后门

目录 SPI定义 SPI核心方法和类 最简单的SPIdemo演示 回顾JCBC基本流程 为什么JDBC要有SPI JDBC java.sql.Driver后门利用与验证 SPI定义 SPI&#xff1a; Service Provider Interface 官方定义&#xff1a; 直译过来是服务提供者接口&#xff0c;学名为服务发现机制 它通…

加油站“变身”快充站,探讨充电新模式

摘要&#xff1a;新能源汽车规模化发展的同时&#xff0c;充电不便利的痛点愈发明显。在未来的新能源汽车行业发展当中&#xff0c;充电的矛盾要远远大于造车的矛盾&#xff0c;解决好充电的问题成为电动汽车行业发展的一个突出问题。解决充电补能问题&#xff0c;重要的方式之…

【牛客】VL60 使用握手信号实现跨时钟域数据传输

题目描述 分别编写一个数据发送模块和一个数据接收模块&#xff0c;模块的时钟信号分别为clk_a&#xff0c;clk_b。两个时钟的频率不相同。数据发送模块循环发送0-7&#xff0c;在每个数据传输完成之后&#xff0c;间隔5个时钟&#xff0c;发送下一个数据。请在两个模块之间添加…

(vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)

(vue)el-checkbox 实现展示区分 label 和 value&#xff08;展示值与选中获取值需不同&#xff09; 后端数据 解决方法 在 el-checkbox 标签中间传入要展示的文本即可&#xff0c;代码如下&#xff1a; <el-checkbox-groupv-model"formInline.processFieldList"…

【C语言】指针超级无敌金刚霹雳进阶(但不难,还是基础)

点击这里访问我的博客主页~~ 对指针概念还不太清楚的点击这里访问上一篇指针初阶2.0 上上篇指针初阶1.0 谢谢各位大佬的支持咯 今天我们一起来学习指针进阶内容 指针进阶 一、指针变量1、字符指针变量2、数组指针变量①数组指针变量的定义②数组指针变量的初始化 3、函数指…

代码随想录第50天|● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

文章目录 ● 123.买卖股票的最佳时机III思路代码一&#xff1a;dp二维数组代码二&#xff1a;四个数存储 ● 188.买卖股票的最佳时机IV思路&#xff1a;代码&#xff1a; ● 123.买卖股票的最佳时机III 思路 dp[i][j]中 i表示第i天&#xff0c;j为 [0 - 4] 五个状态&#xff0…

C++ string类详解及模拟实现

目录 【本节目标】 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 1.2 面试题(暂不做讲解) 2. 标准库中的string类 2.1 string类(了解) 2.2 string类的常用接口说明&#xff08;注意下面我只讲解最常用的接口&#xff09; 3. string类的模拟实现 3.1string类常用…

操作系统篇——虚拟内存到底是个啥?

先祝大家春招都过&#xff0c;后台私信我&#xff0c;可免费获得面试宝典&#xff0c;祝大家都和我一样&#xff0c;顺顺利利面大厂!!! 为什么不直接使用物理内存 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存&#xff08;一个连续完整的…

YOLOv9推理详解及部署实现

目录 前言零、YOLOv9简介一、YOLOv9推理(Python)1. YOLOv9预测2. YOLOv9预处理3. YOLOv9后处理4. YOLOv9推理 二、YOLOv9推理(C)1. ONNX导出2. YOLOv9预处理3. YOLOv9后处理4. YOLOv9推理 三、YOLOv9部署1. 源码下载2. 环境配置2.1 配置CMakeLists.txt2.2 配置Makefile 3. ONNX…

useState多次渲染页面卡顿 useMemo

useState多次渲染页面卡顿 state变化了组件自然应该重新进行渲染&#xff0c;但有时我们并不需要。 React.memo()(useMemo)是一个高阶组件&#xff0c;它接收另一个组件作为参数&#xff0c;并且会返回一个包装过的新组件&#xff0c;包装过的新组件就会具有缓存作用&#xff…

已经连接过github远程库,如何再次推送及删除远程库的内容

基于上次将文件推送到已经建好的github远程库上&#xff0c;此篇文章主要介绍如何再次推送文件去直接已经连接过的远程库&#xff0c;以此如何删除远程库中不想要的文件。 一、推送文件到远程库 1.将所需推送的文件拉入本地库所建的文件夹下&#xff1a;{ex&#xff1a;JVM相…

HTML5:七天学会基础动画网页8

2D缩放:scale scale(x,y) 2D缩放转换&#xff0c;改变元素的宽度和 高度&#xff0c;值为缩放的倍数。 scaleX(n) 2D缩放转换&#xff0c;改变元素的宽度。 scaleY(n) 2D播放转换&#xff0c;改变元素的高度。 跟前面提到的平移同理&#xff0…

Redis 7.0版本主从复制机制

1、引言 Redis是一个开源、高性能、内存键值存储系统&#xff0c;同时也提供了数据结构服务器的功能。它支持五种主要的数据类型&#xff1a;字符串&#xff08;String&#xff09;、哈希表&#xff08;Hashes&#xff09;、列表&#xff08;Lists&#xff09;、集合&#xff…