axw_fae 发表于 2014-6-18 15:20:26

cb2 spi 運行會報錯!

請教一下,有人碰過 spi 接口運行數據一大,就會報錯的問題嗎?

<3> sun7i_spi_xfer: spi0 cpu transfer data time out

一報錯之後, spi 接口就崩掉了,完全無法控制! 但是系統還是活的! 這要如何解決呢?

lin 发表于 2014-6-19 17:47:21

跟踪驱动源码,看看具体报错的上下文是干什么的。
transfer data time out 转换数据超时了。

axw_fae 发表于 2014-6-20 14:44:17

lin 发表于 2014-6-19 17:47 static/image/common/back.gif
跟踪驱动源码,看看具体报错的上下文是干什么的。
transfer data time out 转换数据超时了。 ...

感動呀! 總算有人回復了!

因為若是小數據就不報錯,若是連續 > 100byte 或 快速 寫 spi 時,就會報錯!

感覺 a20 的 spi 驅動並沒有什麼人在驗證呀!真的是蛋疼! 難道是買錯了,應該買 a10 才對!

axw_fae 发表于 2014-6-25 13:09:12

總算找到問題了! 原因就在 linux 進行 spi read 時! 若是長度超過一定的長度! tx_buf 一定要填入 NULL 。 原因不明!

axw_fae 发表于 2014-6-25 13:12:13

本帖最后由 axw_fae 于 2014-6-25 13:15 编辑

另外新的問題發現!

1. 若是在 FEX 中把 SPI CLK 設置 > 24Mhz 時, 板子會強行輸出 48Mhz 。 不管你值設置為多少 80Mhz 60Mhz 50Mzh , SPI_CLK 都是 48Mhz

2. 若是在 FEX 中把 SPI_CLK 設置 > 16Mhz 時, SPI 讀寫就會出錯,同樣的環境
max_speed_hz = 16000000pass
max_speed_hz = 16000001fail   
測試設備,可以在 bbb 上運行 36Mhz 沒有問題! 故應該是 CB2 上面的 SPI 驅動還是有問題!

axw_fae 发表于 2014-6-26 13:40:22

本帖最后由 axw_fae 于 2014-6-26 13:45 编辑

整理一下,目前發現的情況和解決方案,目前使用的是 spi-sun7i.ccb2 a20 spi 驅動:

1. 現出 cpu transfer data time out 的打印
    主要原因為 spi-sun7i 並不支持 full 模式。 也就是說若是 808 行    if (tx_buf && rx_buf) {
      spin_lock_irqsave(&aw_spi->lock, flags);
      aw_spi->duplex_flag = FULL_DUPLEX_RX_TX;
      spi_set_bc_wtc(tx_len, 0, base_addr);
      spin_unlock_irqrestore(&aw_spi->lock, flags);
成立的話,只要長度 > 一定長就,就會產生這錯誤,並且 spi 接口崩死! 解決方案,就是不能 tx_buf 和 rx_bus 皆成立,一定要有值是 NULL 才行

2. fex 中,若是把 SPI CLOCK 上升到 16Mhz 以上,就會報錯
max_speed_hz = 16000000 Pass
max_speed_hz = 16000001 Fail
解決方案,按網上的提示,和 a20 datasheet 中的說明, SDC 這 BIT 要使能才能使用高速的 SPI 。故對驅動進行修改
(1) spi_restore_state 函數中
      reg_val &= ~(SPI_CTL_DDB | SPI_CTL_SS_MASK | SPI_CTL_XCH | SPI_CTL_SSCTL | SPI_CTL_LMTF);
下加上一行
      reg_val |= SPI_CTL_MASTER_SDC;
(2) sun7i_spi_hw_init 函數中
       retrun 0;
前加上一行
      spi_set_sample_delay(1, base_addr);
(3)spi_set_sample_delay 函數中
          reg_val |= on_off;
      這一句改成
      if(on_off) reg_val |= SPI_CTL_MASTER_SDC;
3. FEX 中,若是把 SPI CLOCK 上升 > 24Mhz 時,SPI_CLOCK 會自動以 48Mhz 輸出,目前無解決方案。

axw_fae 发表于 2014-6-26 16:55:30

總算找出 FEX 把 SPI_CLK 上到 > 24 Mhz 時,會自動變成 48Mhz 輸出的問題!

主因是 SPI_CLK 是靠 AHB_CLK / 2 為可以輸出的上限! 而設置值可以接受到 AHB_CLK / 4 以下的值!

也就是說,若是以 AHB_CLK = 96Mhz 時!

SPI_CLK 可以設置96Mhz / 4以下的頻率 ,也就是 24Mhz 以下。

若當 SPI_CLK > AHB_CLK / 4 時,就會變成 AHB_CLK / 2 來輸出了,也就是 48Mhz 了!

若是想要加快 SPI_CLK 到更快的,就必要加速 AHB_CLK 的速度了! 目前還在找尋看在系統中,那一邊可以設置 AHB_CLK

Jimmyxu 发表于 2014-7-9 15:44:53

我的spi-sun7i.c会编译不过,不知你们的会不会这样,是不是需要自己修改才能编译通过??
页: [1]
查看完整版本: cb2 spi 運行會報錯!