微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于spi cpol 和 cpha 四种模式

关于spi cpol 和 cpha 四种模式

时间:10-02 整理:3721RD 点击:
以前做过spi的master 和 slave 模式现在想把两个结合到一块然后做出四种模式
目前遇到最大的问题就是时钟的问题
spi的sck由master发出假如说一个byte的数据 master就发出8个sck(一次上升一次下降沿)
那么我的问题来了
在slave我用的是 异步 fifo接收
在接收到最后一个bit后 sck没了所以在接收完最后一个bit 没了时钟边没办法写入到fifo的ram里头
后来我想到的办法就是 在接收到第七个bit就给写信号 然后写数据我直接拼接
但是还有问题
fifo的controller在接收完数据后还需要时钟把最后的地址寄存一下 然后随时等待读时钟来同步
一切就是说 sck 由master来掌控 多少个bit就多少个sck 根本没多余的时钟给到slave的fifo controller 里头作寄存 同步之类的操作
有没人可以给我提点意见什么的

1. 實作SPI Master/Slave最基礎的方式是, 有一個內部的clock; 作為Master的時候, SCK是由這個clock除頻而得; 作為Slave的時候, 這個clock用來sampling外部灌進來的SCK. 由於這個clock一直存在, 所以即使作為Slave, 還是有clock將MOSI的資料移位進來. 缺點是, (設計得當的話) 能夠接受到最快的SPI頻率, 是內部clock的一半.
2. 假如SPI Slave的部分完完全全是由外部的SCK提供, 那麼就需要考慮與Chip Select合併使用判斷. 利用Chip Select的上升或下降沿, 來做第一或最後一個bit的移位.

我是16年初才开始在IC这块边学边工作 所以有些还不太懂
关于第一点你说的内部clock 我可以理解为总线的时钟吗
还有第二点 我应该已经用上了例如 cpol=0 cpha=0 的模式
第一个sck沿就要采数据 然而第一个沿之前sck还没生效 我就是用chip select来发第一个bit
只是我现在的问题是当我slave接收完了数据 这时候sck也没了但是我要写到ram里头需要的信号
: clkcen wen addr data
这里的clk是由sck给的 已经没了 所以数据也写不进去
我q号458363548方便的话加我q给我点意见

458363548这是我qq
方便的话可以加我好友给我点意见

这是我QQ方便的话可以加我一下 给我点思路

458363548我QQ号
发了两次好像发不出去。

1. 是的. 你可以用總線的時鐘
2. 發第一個bit? 作爲Slave的時候, 我估計你指的應該是MISO.你可以去看看一些其他的設計, 大部分的SPI Slave Mode 0或Mode 3, 通常是SCK下降沿把MISO推出去, 上升沿把MOSI收進來

相当于高频时钟去采样低频时钟,或者分频为低频时钟

关于数据进出这部分我可以解决 然后最让我困扰的是我作为slave模块要接收N个byte数据时关于最后一个数据的处理slave 模块 有一个异步rx_fifo
其中wclk连的是master 的 sck
rclk连的是总线的 clk
然后在mode3 (cpol=1,cpha=1) 这种模式下 sck的上升沿为采数据
在master 给到 slave的sck最后一个沿就是上升沿 然后一直保持着1
页就是说当slave 在最后一个上升沿接收到最后一个bit后 sck 就停止了
然而在我接收完最后一个bit后 我要把完整的一个byte压到fifo里面
可是如我上面说的 我的rx_fifo 写时钟连的是sck 而slave 接收完最后一个bit的时候 master不会再给时钟了
我也没办法把最后一个数据压到fifo里面了

明白我现在想知道的是作为slave 怎么去处理接收到的数据



spi的速率是很低的,以一个高频去采样他的边沿,同时采样数据

我推想了一下, 這可能是您的問題所在: 作爲Slave, 當最後一個SCK收到bit後, 所有的數據都在移位寄存器裡, 但仍差了一拍把這筆data寫入FIFO. 我的理解正確嗎?
假如是如此, 可能會建議你把移位寄存器, 在 "操作" 上當成FIFO的一部分. 實際上的作法可能類似如下:
1. 假如FIFO內有資料, 取完FIFO後的資料之後, 再讀shift register
2. 假如FIFO內無資料, 直接讀shift register.
3. 假設FIFO深度為N, 那麼最大容許的讀取量應該是N+1

虽然不太理解你说的那三点的意思 不过我也从你的建议想出了解决办法我利用第八个sck 本来这个时钟是用来接收第八个bit的我直接用这个时钟来写数
数据用寄存器和master来的数据拼接写进ram里面
接下来可能就是fifo controller 的问题了
异步的fifo 每次来一个写脉冲后
写count会默认加一
然后controller会用写时钟拍一下然后再把这个寄存的count转换成格雷码 等待读时钟来取数 判断rempty信号
问题又来了
我上面是在第八个sck造出一个脉冲写fifo 数据是在脉冲后的上升沿写到ram里面 这时候已经没有了sck (就是写时钟)controller寄存新的count
就因为controller没有寄存下最后这一个新count
导致地址没加
所以最后的一个byte的数据读出来是不对的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top