CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 7568|回复: 7

cb2 spi 運行會報錯!

[复制链接]
发表于 2014-6-18 15:20:26 | 显示全部楼层 |阅读模式
請教一下,有人碰過 spi 接口運行數據一大,就會報錯的問題嗎?

<3>[spi-err] sun7i_spi_xfer: spi0 cpu transfer data time out

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

使用道具 举报

发表于 2014-6-19 17:47:21 | 显示全部楼层
跟踪驱动源码,看看具体报错的上下文是干什么的。
transfer data time out 转换数据超时了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-20 14:44:17 | 显示全部楼层
lin 发表于 2014-6-19 17:47
跟踪驱动源码,看看具体报错的上下文是干什么的。
transfer data time out 转换数据超时了。 ...

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

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

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

使用道具 举报

 楼主| 发表于 2014-6-25 13:09:12 | 显示全部楼层
總算找到問題了! 原因就在 linux 進行 spi read 時! 若是長度超過一定的長度! tx_buf 一定要填入 NULL 。 原因不明!
回复 支持 反对

使用道具 举报

 楼主| 发表于 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 = 16000000  pass
max_speed_hz = 16000001  fail   
測試設備,可以在 bbb 上運行 36Mhz 沒有問題! 故應該是 CB2 上面的 SPI 驅動還是有問題!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-26 13:40:22 | 显示全部楼层
本帖最后由 axw_fae 于 2014-6-26 13:45 编辑

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

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

2. fex 中,若是把 SPI CLOCK 上升到 16Mhz 以上,就會報錯

  1. max_speed_hz = 16000000 Pass
  2. max_speed_hz = 16000001 Fail
复制代码
解決方案,按網上的提示,和 a20 datasheet 中的說明, SDC 這 BIT 要使能才能使用高速的 SPI 。故對驅動進行修改

  1. (1) spi_restore_state 函數中
  2.         reg_val &= ~(SPI_CTL_DDB | SPI_CTL_SS_MASK | SPI_CTL_XCH | SPI_CTL_SSCTL | SPI_CTL_LMTF);  
  3. 下加上一行
  4.         reg_val |= SPI_CTL_MASTER_SDC;
  5. (2) sun7i_spi_hw_init 函數中
  6.        retrun 0;
  7. 前加上一行
  8.         spi_set_sample_delay(1, base_addr);
  9. (3)  spi_set_sample_delay 函數中
  10.           reg_val |= on_off;
  11.       這一句改成
  12.       if(on_off) reg_val |= SPI_CTL_MASTER_SDC;
复制代码
3. FEX 中,若是把 SPI CLOCK 上升 > 24Mhz 時,SPI_CLOCK 會自動以 48Mhz 輸出,目前無解決方案。
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
回复 支持 反对

使用道具 举报

发表于 2014-7-9 15:44:53 | 显示全部楼层
我的spi-sun7i.c会编译不过,不知你们的会不会这样,是不是需要自己修改才能编译通过??
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-4-28 19:11 , Processed in 0.024287 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部