在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
EETOP诚邀模拟IC相关培训讲师 创芯人才网--重磅上线啦!
查看: 2899|回复: 1

[原创] Mipi SoundWire Spec 学习笔记(欢迎交流,持续更新)

[复制链接]
发表于 2022-5-19 17:37:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 Distent 于 2022-6-6 09:20 编辑

一、SoundWire 概述:
SoundWire是MIPI提出的一个接口协议,与I2S,HDA一样,是音频接口协议。其特点是:
1. 通过一个 two-pin接口来传输音频data,控制命令等。
2. 其clock scaling 和可选的多条data lane给予data频率更高的灵活度以匹配系统要求。
3. 因为用了DDR(double data rate)数据传输方式,因此可以使用更低的时钟频率和功耗。
4. 单个master可以连接最多11个slave。
5. 支持slave to slave的数据传输方式。
6. 支持多负载传输机制(multiple payload transport mechanisms),包括同步或者异步的音频流。
7. 帧大小可以灵活配置,payload具有复杂性,支持PCM和PDM音频流。
8. 低延时,高采样率。


二、SoundWire 物理层接口(PHY):
SoundWire接口使用两根信号做设备之间的连接:
• Clock – 从master发送到全部slave的时钟信号。
• Data – 可以被所有设备驱动的data信号,并且可以配置没有设备驱动它的时候的空载值。

SoundWire 设备(device)与PHY:
b4210e8090664970aa315948dc9d1530.png

                               
登录/注册后可看大图


上图为SoundWire的master interface和slave interface,内部的digital interface负责传送payload,command等,而PHY负责提供本设备与其他SoundWire设备的物理连接(两线接口)。


Data Signaling and Bitslots
1. SoundWire采用DDR(double data rate)进行数据传输。1个bit在上升沿的时候被驱动,并且在下降沿被采样,下一个bit在下降沿被驱动,在上升沿被采样。数据可以在上升沿和下降沿被采样,所以数据传输频率时时钟的两倍。
2. SoundWire帧内每一个bit叫做bitslot,帧内第一个bitslot叫bitslot[0],后面以此类推,bitslot[n]紧接着bitslot[n-1],所以bitslot[0]时紧跟着上一帧的最后一个bitslot。
3. Bitslot里面的的值,都是由0个,1个,甚至是多个SoundWire设备提供的。如果一个设备提供了这个bitslot的值,我们称为这个设备own了这个bitslot(这个设备就叫the owner of the Bitslot)。



SoundWire采用改进的NRZI进行数据编码(这段不是很懂)

NRZI编码:
    下图为NRZI编码方式,当data值发生变化时,表示为1,当data值不变时,表示为0,如果要传输“1101011”,则最终data的值为“HLLHHLH”或者“LHHLLHL”,前者还是后者,取决于传输信号前,data的状态。

280260a3476841ffb1a609630544e4a5.png

                               
登录/注册后可看大图

改进的NRZI编码:
    SoundWire采用改进的NRZI编码,意味着如果设备想从SoundWire总线上抓取数据作为自己的input data(例如Bitslot[n]),则要根据时钟,采样两个点(例如Bitslot[n-1]和Bitslot[n])进行对比。同样,如果设备想从SoundWire总线上输出data(例如Bitslot[n]),则需要采样当前data的值(例如Bitslot[n-1])来确认输出的data应该是什么值。
    这个改进的NRZI的不同点在于,只有在逻辑“1”的时候,data output信号被主动驱动起来,逻辑“0”的时候,data信号可以被被动驱动起来。
580daf0237ce4f86998e5abc4b4964b2.png

                               
登录/注册后可看大图

这样做有两个好处:
1. 如果当前的bitslot没有owner,或者是由于某些data原因没有被驱动,这个master的bus-keeper会让data保持逻辑0状态,这有利于检查出丢失的设备和某些错误配置;
2. 允许同一个bitslot拥有两个甚至多个owner,多个owner之间的关系是“线或”(wire-ORed),意味着一个owner要输出逻辑1,对于其他逻辑0拥有更高的优先级。



三、帧结构与Control Word:
帧结构
SoundWire的帧可以看作成一个二维数组,由比特流(bitstream)的行和列组成。其中,行的值是48~256里面的几个值,同样,列是2~16。这些master设备可以通过配置寄存器来决定的,同时这些帧的属性变量是动态可配的。初始的帧大小就是96个bitslot(48行,2列)。
配置列数:
efcd817a05334001bb02a1eae5ed923b.png

                               
登录/注册后可看大图

配置行数:
a529c32d2d1241a6842372fba4faeea3.png

                               
登录/注册后可看大图


    每一帧的第一个bitslot开始于时钟的下降沿(第一个output data生成),并且结束于时钟的上升沿(最后一个bitslot被采样)。因为列数永远是偶数,所以下一帧的第一个bitslot也总是在时钟下降沿开始。
    但是SPEC说的一帧的最后一个bitslot结束和下一帧的开始bitlost是同一个moment,这个不太理解,我的理解是第N帧的结束和第N+1帧的开始,应该是相差一个周期的。
9ed18d131993472197c2a02fa89f149c.png

                               
登录/注册后可看大图

下图为帧结构的图:
95ca49682b8b46a4bb88162eaf593778.png

                               
登录/注册后可看大图



Control Word
    在帧结构中,第一列的前48个bitslot为control word({row[0],col[0]},{row[0],col[1]}......{row[0],col[48]}),由于bitstream传输是一行一行(row)传输的,因此control word在bitstream上是不连续的。前48列中,每列第一个为control word的一部分,该列剩下的bitslot都是data payload。下图为control word在帧结构中的位置。
24eb31cad98c45ed81c77ee10f455e4c.png

                               
登录/注册后可看大图


    在control word里面的bitslot被分配成以下两种功能:
• Control BitSlot(20):负责一些低层级的功能,例如帧同步等。
• Command BitSlot(28):负责帮助当前的command owner传输command给其他设备,也负责接收respond给command owner。
f625f03f053d4fe4aaf5f901fa091707.png

                               
登录/注册后可看大图

0edb07bd156a40b3a625782fe8dbac12.png

                               
登录/注册后可看大图




Control Word field
1. PREQ(Ping Request):
     一个或者多个Slave用于通知Owner,其需要在Ping command 中上报一些状态。因为多个slave的data pin是"线与"关系,所以只要有一个slava拉起了PREQ,Owner收到的这一帧的PREQ都会被拉起来。当owner收到这个PREQ时,会在接下来的32帧内发送ping command去读取slave的状态。在第N帧内发生类似中断等信息需要发送PREQ时,已经晚于当前帧发送PREQ的时机了,因此会在N+1帧甚至N+2帧的时候才能发出PREQ,一旦拉起了PREQ,slave会一直拉起来直到其能成功收到来自Owner的ping command。
2. Opcode:
Opcode由3个bit组成,command field的组成由Opcode来决定。Opcode由Master或者Monitor接口(command owner), slave接口接收到不同的Opcode和对应的command field之后会做相应的动作。Opcode有3种:
• Ping:让总线上的所有slave返回状态。
• Write:Command Owner给一个或者多个设备中一个或者多个寄存器写一个8 bit 的值。
• Read:Command Owner从一个或者多个设备中一个或者多个寄存器读一个8 bit 的值。
92ff5ebc2c144cd09f4909ab43282373.png


  当Opcode为Ping的时候,command field如下:
bde98313e29448d9b0024354dd969763.png

                               
登录/注册后可看大图

fe1a4c030ffe48daa312892b07f7a9ab.png

                               
登录/注册后可看大图


         当Opcode为Write或者Read的时候,command field如下:
1a89f7603c544a7c97f451740994b016.png

                               
登录/注册后可看大图


          当Opcode为Reserved的时候,command field如下:
efb209beebe4455890045bfa0534a6cf.png

                               
登录/注册后可看大图


3. Static Synchronization
     Static Synchronization是一个固定的8bit的值为 b'10110001,由master产生,slave接收,并以此来维持帧同步。

4. PHY Synchronization
    PHY Synchronization为1bit,由master生成,通知slave当前的PHY属于什么状态:0代表普通的PHY,1代表High-PHY。当Slave收到这个值的时候,会把PHY_Sync值写到对应的寄存器中。

5. Dynamic Synchronization
    Dynamic Synchronization为4个bit,为连续15个帧的一个动态码。由于只看Static Synchronization的话,比特流可能刚好与Static Synchronization一致,导致SoundWire总线进入假连接状态,加入Dynamic Synchronization后能更好的解决这个问题。Dynamic Synchronization的值来自于4-bit LFSR(linear feedback shift register)寄存器,其通过一个PRBS (pseudo-random binary sequence) 产生器生成出来。LFSR初始值为b’1111。
189c163e9d9a46acb7b3c6ab2f1b3295.png

                               
登录/注册后可看大图



6. 奇偶校验 PAR
    Control Word中,存在一个奇偶校验位PAR,来检测data信号传输过程中是否出现错误。注意,奇偶校验的是data电平的高低次数,而不是逻辑的0和1
c7ebc9ccca9241c5b201bbacb3d353f4.png

                               
登录/注册后可看大图

     PRA由Command Owneri经过计算后产生,并发送到别的设备进行匹配,如果设备计算出的PRA与Owner送出的PRA不一致,可能会引发中断(如果中断使能的话),并且会发送一个Command_Failed的response,让该总线上所有设备都丢弃这一帧,使得设备不会被这次错误传输所影响。
    奇偶校验的窗口超过了一帧的边界,当Master修改帧结构,奇偶校验的窗口会包括上一个帧结构的部分Bitslot,和新的帧结构的部分Bitslot。下图为帧和校验窗口的关系图,注意,PAR并不是紧跟着校验窗口的,而是和奇偶校验窗口相差几个bit,多少个bit取决于你的列数,主要也是给Master计算PAR的时间。另外,校验窗口内所有的数据有需要拿来校验,包括上一帧的PAR。
a0718fb2774b4cb1b1087e4563f591a3.png


    下图为奇偶校验窗口的细节图。首先我们可以看到,校验窗口N只到了[44,0],此时窗口N的数据会被短暂存储起来用于计算PAR,校验窗口N+1由[44,1]开始。因此,44行的[44,1]~[44,15]都是窗口N+1的计算值,包括了窗口N的PAR本身,也是窗口N+1的计算值。
05f8c1a674dc4d769834d664a921a6f1.png

                               
登录/注册后可看大图


7. Response,NAK & ACK
Control Word中,存在两个bit,NAK和ACK来描述对Command的Response。
    当一个设备被选中是command 的目标时,其response的NAK和ACK的组合可能如下:
• Command_Failed (NAK=1 & ACK=0):例如奇偶校验失败。
• Command_OK (NAK=0 & ACK=1):例如顺利完成读操作并返回读数据。
• Command_Ignored (NAK=0 & ACK=0):例如读了一个只写寄存器。

    当一个设备被选中是command 的目标时,其response的NAK和ACK的组合可能如下:
• Command_Failed (NAK=1 & ACK=0): 例如奇偶校验失败。
• Command_Ignored (NAK=0 & ACK=0):例如自身并不是读写操作的目标设备,或者奇偶校验没有失败。


Command Fields
1. Stream Synchronization Point (SSP)
    SSP是Command Fields中的1个bit,用于设备间的传输同步。同时,当一个设备中,出现了不同的采样率,且采样率之间不是倍数关系,则需要用到SSP来使采样率和帧率同步。

2. Bus Request (BREQ)
BREQ是Command Fields中的1个bit,Monitor通过拉起BREQ申请成为Command Owner。

3. Bus Release (BREL)
BREL是Command Fields中的1个bit,Master通过拉起BREL允许Monitor成为Command Owner。

4. Slave Status (Slv_Stat_nn)
    这个field一共是24个bit,一共包含了12个slave的状态(每个slave占用2个bit,slave0~11),这些状态包括:
• Slave 未成功连接。
• Slave 成功连接但是没有中断信息。
• Slave 成功连接并至少有1个中断需要上报。

5. Device Address (DevAddr)、Register Address (RegAddr)​​​​​​​、Register Data (RegData)
    Addr和Data,其中DevAddr 4个bit,RegAddr 16个bit,RegData 8个bit。


四、帧同步
Master 初始化
    Master有时候会先发一段时间的时钟,再经过初始化,发出动态同步码和静态同步码等等,这并不妨碍slave识别和同步,因为slave总是匹配上了所有的同步码步骤之后,再进入同步状态。Master一开始发的帧是48行2列的结构,这样slave能过够更快同步上master。而且这种帧结构中,读写command占整个帧的比例最大,因此读写command的带宽会更大(同样的时间能送出更多的command),一旦枚举结束,所有slave同步了,master就可以改变帧结构来传输数据了。

Slave 同步步骤及SS_SM(Slave Synchronization State Machine)
    Slave同步通过一个状态机SS_SM来实现,这个状态机体现了:
    1. slave 如何与总线上的master进行同步;
    2. slave 如何从总线上失去同步。
    这个概念图为了简单阐述这个过程,因此同步过程只用了一种搜索算法和简单的参数去完成同步,实际上,真正的同步过程会用更高级的算法,并且使用多个参数(例如多种行和列的组合)去进行同步。同步时间的长短取决于slave自身的参数,master发送所用的参数,甚至是传送的data和command。另外,下图还包括对设备进入High-PHY mode的检测。实际上,系统会等所有的slave都具备High-PHY功能的时候,才会有可能进入High-PHY mode。
下图为SS_SM概念图:
1f73a96c2e654535b4486f45f99941f8.png

                               
登录/注册后可看大图


状态描述:
State name描述表现
Unattached                        slave没接收到任何正确的静态同步码,所以不能正确的连接在总线上。
                        当前的搜索静态同步码的帧结构的列数可能是不正确的,并且行数也是未知的。
                        
                        slave不会own任何的bitslot。
                        slave会循环使用这些可能的列数去寻找静态同步码。保证先确定列数。
                        
Column_OK                        slave只接受过一次正确的静态同步码,并且不能正确的正确的连在总线上。
                        设定的列数可能是正确的。但是行数仍然是未知的。
                        
                        slave不会own任何的bitslot。
                        slave会假定这个列数是正确的,并去寻找第二次正确的静态同步码,以确定行数去初始化对应的寄存器。
                        
Colume_Row_OK                        slave还没接收足够的静态,动态以及PHY同步码,并且不能正确的连在总线上。
                        行数,列数以及High-PHY状态都可能是正确的。
                        
                        slave不会own任何的bitslot。
                        slave假定行数和列数都是正确的,并检查接下来15帧的静态,动态和PHY的同步码,以确定之前初始化的寄存器内容是否正确。
                        
Attachedslave接受了足够多的静态,动态和PHY同步码,并且已经正确地连在了总线上。slave可以own bitslot来写control word或者data payload了。
Attached_Error_1                        slave已经attached了,但是收到当前一帧在同步码上出现错误的值
                        
                        slave可以own bitslot来写control word或者data payload了。
                        同时,slave会假定行数列数以及High-PHY域仍然是正确的,并检查当前一帧的剩余部分以及下一帧的静态,动态和PHY同步码,以此来确定行数列数以及High-PHY域是否正确。
                        
Attached_Old_Errorslave是连在总线上的,但是上一帧的同步码有出现错误的值。同上

转跳条件描述:
转跳条件名字描述
Static_Sync_Missingslave使用候选的列数进行搜索静态同步码 'b10110001,但是经过大于或者等于256个bitslot之后,仍然没找到。
Static_Sync_1_OKslave使用候选的列数去搜索静态同步码 'b10110001,并且搜索成功。
Static_Sync_2_OKslave在上一次成功搜索静态同步码之后,256个bigslot之内再次搜索成功。
Full_Sync_OKslave用当前了的行数和列数以及寄存器值(PHY)正确的接受了所有的同步码。
Any_Sync_Errorslave用当前了的行数和列数以及寄存器值(PHY)接受的同步码中出现了错误。
PHY_OK_to_Attach                        满足下面其中一个条件:
                        1. SCP_SystemCtrl寄存器的High-PHY_Select域为0(Basic PHY)
                        2. 下列条件同时满足:
                             a. High-PHY 的值是1
                             b. slave 在High-PHY模式下
                             c. SCP_Stat寄存器的High-PHY_NotOK域为0
                        
End_of_Frameslave继续用当前的行数和列数去检查当前一帧剩余部分的同步码,并且所有剩余的bitslot的值都是正确的,没有发生别的错误使状态机进入Unattached状态。
Self_Detach                        slave因为某些原因自行选择下线。
                        



五、系统控制(System Control)    主要介绍下SoundWire的底层功能,包括复位,时钟,data驱动冲突,PHY切换等等。

复位
    SoundWire设备的复位分为3种,都会导致设备变成unattached,从而需要重新attached到总线上并且等待重新枚举,根据影响排列从小到大,3种复位分别是:
1. 软复位(Soft Reset)
    软复位一般发生于设备出现同步错误的时候,当设备同步码出错误bit位出现太多了,就会出发软复位。此复位对设备影响最小,仅仅是防止设备在错误的时间往总线发送信息。当设备重新连上总线并枚举结束后,master可以读取设备的寄存器进行debug。
2. 硬复位(Hard Reset)
    影响第二小的是硬复位,例如时钟停止,或者往SCP_Ctrl寄存器写ForceReset都能触发硬复位。硬复位对slave内部多个(或者全部)的状态都有影响,取决于designer如何设计。
3. Severe Reset
    影响最大的是Severe Reset,例如Power_on Reset或者Bus Reset。其影响包括了硬复位所影响的部分,另外,一些自初始化之后就不会更改的部分,例如PHY output control,都会被Severe Reset所影响。
4. Bus Reset
    如下图,如果设备连续接收了超过4096个逻辑1时(即2046个时钟周期),就会在第4096个逻辑1的时候触发Bus Reset。之后只要保持发送逻辑1,设备就会一直保持复位状态。
95015727d9a84c4da66463efefa9eed7.png

                               
登录/注册后可看大图





发表于 2024-8-22 17:11:40 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-9-8 12:24 , Processed in 0.018141 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表