This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28335: 與 FPGA 用 spi 通訊溝通問題

Part Number: TMS320F28335

您好,

我目前在使用 DSP (TMS320F28335) 與 FPGA板子 (PYNQ-Z2) 用 spi 通訊作溝通。

希望能夠以 DSP 作為 master 傳送浮點數數值 (例如: 0.12 0.121 0.122 ......) 到 作為 slave 的 FPGA ,但在測試時 FPGA 接收到的值有些會有錯誤。

原先猜測是會多一個0在最前面 (以2進制表示時),像是我原先要傳 1111111111111111 結果會變成 0111111111111111, 多的1會被推到下一列,試著手動全部往前推一位後仍然會一些值是錯的,

想知道這個問題是什麼導致的,以及該如何修正。

以下是往後移一位之後的部分結果 (紅色字為有嚴重錯誤): 

0.120   -> 0.11951171606779099

0.121  ->  0.12099999934434891

0.122  ->  0.12200000137090683

0.123  ->  0.12300000339746475

0.124  ->  0.12399999797344208

0.125  ->  0.1259765774011612

0.126  ->  0.12502342462539673

0.127  ->  0.12797658145427704

0.128  ->   0.12702342867851257

0.129  ->  0.12997658550739288

0.130  -> 0.12902343273162842

......

另外,DSP這邊是以範例:

https://dev.ti.com/tirex/explore/node?a=AocYeEd__2.0.0&node=A__AHg0dkUKptZrNiSRKvCtVw__c2000ware_software_package__gYkahfz__LATEST&r=AocYeEd__1.0.0&r=AocYeEd__LATEST&search=F28335

來做更改的,以下是我更改過的程式碼:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
//#include "DSP2833x_Device.h"
//
// Function Prototypes
//
//__interrupt void ISRTimer2(void);
void delay_loop(void);
void spi_xmit(Uint16 a);
void spi_fifo_init(void);
void spi_init(void);
void error(void);
union datatype{
float f_type;
Uint16 u_type[2];
};
union datatype sdata;
union datatype rdata;
char data_switch=0;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

再麻煩替小弟我解惑了!! 

  • 您好,我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!

  • 您好,

    看起来像是 SPI 时钟极性和相位设置的问题。 您能否确认下SPI MOSI 引脚是否按 FPGA 的预期进行了切换? 

  • 您好,有確認過FPGA跟DSP兩邊的的設定,都是設定為 clock polarity = 0, clock phase = 0,這幾天有修改FPGA部分的程式,雖然多一個0的問題仍存在,但暫時可以取得正確的數值了,可以的話還是希望能夠解決這個問題。

    另外,有發現FPGA回傳給DSP的值同樣會有問題,需要經過循環位移的方式才會得到正確的值,例如:

    FPGA原先要傳   0, 1, 2, 3, 4, ...., 32768, 32769, 32770, 32771, ....

    DSP這邊會收到  0, 2, 4, 6, 8, ....,         1,         3,         5,         7, ....

    經過以下計算後DSP才會得到正確的值:

    result = (val << (16 - 1) | (val >> 1));    // val 為DSP收到的值。

    不知道這兩個問題是不是同一個問題產生的,或是彼此之間有關聯性?

  • 好的我们向工程师确认下哈。

  • 您好,

    有確認過FPGA跟DSP兩邊的的設定,都是設定為 clock polarity = 0, clock phase = 0,

    这就是我们在强调的,这些设置可能在 FPGA 和 MCU 之间有完全不同的实现方式。 还请您仔细查看 TRM。 一个时钟极性=时钟相位= 0会导致之后的时序,即数据在时钟的上升沿切换,采样在时钟的下降沿。 这是否是 FPGA 所期望的?

      

  • 不好意思,過了這麼久才回覆,因為有其他的進度暫時擱置了。
    這幾天回去檢查兩邊 TRM 後發現兩邊對於clock polarity, clock phase 的定義不一樣,

    FPGA 的 clock polarity=0 為 DSP 的 clock polarity=1 調整過後,接收的值都正常了。

  • 好的那您的问题解决了就好,之后如有其他问题需要技术支持也欢迎您随时发帖。

x 出现错误。请重试或与管理员联系。