目录
主要从总线协议的特点,信号以及它的功能,读写协议,以及几种传输格式来具体总结它们。
AMBA(高级处理器总线架构)专门为SOC设计提供的通信标准,不同的速率需求构成了不同的分类。从高到低依次是AXI -> AHB -> APB。

它们的外接设备的对比:

从上面这个图可以看出AHB和APB的外接
APB: 从端设备分为:
APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4 。
APB2(高速外设)上的设备有:GPIO_A-E、USART1、ADC1、ADC2、ADC3、TIM1、TIM8、SPI1、ALL。
AHB:主设备是CPU,DMA 等控制器 从设备是: RAM等存储器,还有AHBtoAPB Bridge
AXI:和AHB的主从设备差不多。
| 信号 | 描述 |
|---|---|
| PCLK | 时钟,APB协议里所有的数据传输都在 PCLK上升沿进行。 |
| PRESETn | 复位,低电平有效。 |
| PADDR | APB地址总线,最大宽度为 32 bit。 |
| PSELx | 选通从端,APB master 会将此信号生成给每个slave,它表示已选择的slave,并且需要进行数据传输。每个slave 都有一个 PSELx 接收信号。 |
| PENABLE | 使能,当它为高时,表示数据有效。 |
| PWRITE | 读写控制,=1 时表示写操作,=0 时表示读操作。 |
| PWDATA | 写数据,master 通过 PWDATA 将数据写到slave,该总线最大宽度为32bit。 |
| PRDATA | 读数据,master 通过 PRDATA 将数据从slave 读取回来,该总线最大宽度为32bit。 |
总的来说就是:master读取来自slave的数据,而且APB是固定两周期传输。
在这两个完整周期内,master要发送 PADDR地址以确定要连接哪个slave,要把 PSEL=1 表示对这个slave进行选通,还要把 PWRITE = 0 表示读操作。
在两周期的第二个周期中,master 要把 PENABLE = 1 ,表示使能可以接收数据了。同时 salve 把数据通过 PRDATA 发送给master。
在PENABLE 拉高的下一个上升沿, master 读取数据是准确的,也就是在图中的 T4 上升沿。
最后一次读的传输完成后,PSEL,PENABLE 拉低, PADDR, PWRITE 不变,这样可以紧接着进行下次读传输,实现省电。

写操作和读操作大致是相同的,唯一不同的是 master 往 slave 里写数据,故 PWRITE = 1 ,数据线 PWDATA 要同地址线一样在两周期内保持。
值得注意的是:依然为了省电,在一次写传输完成后,PADDR 和 PWRITE 要保持不变。

在APB2诞生后,随着行业发展,对于APB协议有了新的需求,ARM公司针对这些需求,在APB2的基础上添加了两个端口,一个是PREADY和PSLVERR。PREADY是一个对于slave的准备信号,用于扩展APB的传输协议。PSLVERR是一个错误反馈信号,表示当前传输的数据有误。把这种协议叫做APB3。
除了上面提到的APB2两种基本的读写操作协议,APB3又分别为读写多了一种协议。
针对 PREADY信号
首先是读有等待:
当PSEL和PENABLE都为高的时候,slave 把 PREADY拉低了,说明slave没有准备好,需要等待一段时间。在T5时刻这条虚线,发现PSEL,PENABLE,PREADY都为高,说明这个时候采样的Data是我们想要读取的data。
也就是在有PREADY拉低的情况下,master在 PREADY拉高的下一个时钟上升沿采样数据。

然后是写有等待:
和读操作一样,因为 PREADY的拉低,表示slave没准备好,而使得 控制线,地址线,数据线都再不得不延长几个周期直到 PREADY 拉高为止,数据的传输才算有效,数据的传输才算结束。

针对PSLVERR
我们可以通过使用PSLVERR来指示APB传输上的错误情况。读取和写入事务都可能发生错误。当PSEL,PENABLE和PREADY均为高电平时,仅在APB传输的最后一个周期内才认为PSLVERR有效,其他时间不考虑PSLVERR。
首先是读有等待,并且数据有错误:
在前面的添加了PREADY信号的读操作的基础上,添加PSLVERR,也就是在数据传输的最后一个周期,发现PSEL,PENABLE和PREADY均为高电平的前提下,PSLVERR为高,说明这次数据传输有错误。

然后是写有等待,并且数据有错误:
和读操作是一样的。注意:当任何一个PSEL, PENABLE或者PREADY为低时,你可以将PSLVERR拉低,这是推荐,并不是强制要求。事物处理收到一个错误后,可能或不可能改变外围器件的状态。APB外围设备不要求必须支持PSLVERR引脚,当不使用该引脚时,应被置低。

小总结:
APB2到APB3的变化是多了两个信号,PREADY 和 PSLVERR, 故读写操作也由原来的基础传输多了有等待的传输,有错误标志的传输。
APB4在APB3的基础上添加了两个端口,一个是PPROT,一个是PSTRB。
PPROT:一种保护信号,可支持APB上的非安全传输和安全传输。
PSTRB:一个写选通信号,用于在写数据总线上进行稀疏数据传输。
PPROT每一位代表的作用不同,总结如下表。
| PPORT | 一种保护信号,可支持APB上的非安全传输和安全传输。 |
| PPROT [0]: | 0:普通;1:特权。一些master使用它来指示其处理模式。特权处理模式通常在系统内具有更高级别的访问权限。 |
| PPROT [1]: | 0:安全;1:非安全。这用于需要更大程度区分处理模式的系统中。 |
| PPROT [2]: | 0:数据;1:指令。该位指示事务是数据访问还是指令访问。此指示仅作为提示,并非在所有情况下都是准确的。 |
写选通信号PSTRB使写数据总线上的稀疏数据传输成为可能。
PSTRB信号可以使写数据总线上的数据片段化,即指示数据总线上那几个字节数据有效。
由于数据位最大为32bit,即4个字节。因此PSTRB位宽为4位,每一位对应一个字节,设置为1时,指示该字节数据有效。注意的是,在读操作中,PSTRB所有位必须设置为低电平。
当置为高电平时,写选通脉冲指示写数据总线的相应字节通道包含有效信息。
写数据总线的每八位有一个写选通脉冲,因此 PSTRB [n] 对应于PWDATA [(8n + 7) : ( 8n)]。
下图显示了32位数据总线上的这种关系。

APB4比APB3又多了两个信号,一个 PPROT 保护信号,一个 PSTRB 写选通信号。
总的来说,APB 读操作时序分为: 无等待,有等待无错误,有等待有错误。
写时序分为: 无等待,有等待无错误,有等待有错误。
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景 最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。 在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记
一、RIPV2协议简介 RIP(RoutingInformationProtocol)路由协议是一种相对古老,在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP采用距离向量算法,是一种距离向量协议。RIP-1是有类别路由协议(ClassfulRoutingProtocol),它只支持以广播方式发布协议报文。RIP-1的协议报文无法携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1不支持非连续子网(DiscontiguousSubnet)。RIP-2是一种无类别路由协议(ClasslessRoutingProtocol),支持路由标记,在路由策略中可根据路由标记对
【动态规划】一、背包问题1.背包问题总结1)动规四部曲:2)递推公式总结:3)遍历顺序总结:2.01背包1)二维dp数组代码实现2)一维dp数组代码实现3.完全背包代码实现4.多重背包代码实现一、背包问题1.背包问题总结暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(DynamicPlanning)里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。1)动规四部曲:(1)确定dp数组及其下标的含义(2)确定递推公式(3)dp数组的初始化(4)确定遍历顺
1FPGA启动流程图1 7SerialsFPGA配置流程1.1DevicePower-Up1.2ClearConfigurationMemory在上电后的任何时间内,可以对Slave-FPGA配置存储器(BlockRAM)进行复位处理。复位方式是将PROGRAM_B信号拉低(下降沿有效)。1.3SampleModePins当复位完成后,INIT_B恢复高电平,Slave-FPGA对M[2:0]模式引脚进行采样,然后开始在CCLK上升沿接收配置数据。1.4Synchronization在接收配置数据前,Slave-FPGA首先进行总线位宽检测。主机发送的配置文件中,“BusWidthAutoDe
我尝试执行此页面中显示的ruby示例:http://tomayko.com/writings/unicorn-is-unix但我得到的只是echo.rb:9:in`bind':Addressfamilynotsupportedbyprotocolfamily-bind(2)(Errno::EAFNOSUPPORT)fromecho.rb:9:in`'有什么想法吗? 最佳答案 我遇到了同样的问题。只需将localhost更改为0.0.0.0:address=Socket.pack_sockaddr_in(4242,'0.0.0.0')
最近我使用了一个由单个开发人员创建的不错的gem,它托管在Github上。在我的工作中,我不得不对它进行一些实质性的修改,添加一些改进。有些是特定于项目的,有些是特定于gem的,还有一些是独立的改进。对于特定于gem的改进(例如,错误修复),我fork了存储库,应用了修复,并提出了拉取请求。然后,然而,我注意到独立的改进有点属于原始gem的并行、持续的分支类别。更清楚地说,你以前见过它;我重写了原始gem的View以使用TwitterBootstrap框架。因此,我也将它推送到了Github,但是,当然,我没有提出拉取请求——相反,我更新了README以解释不同之处,并感谢gem的原作