用zedboard板上的adau1761採集音訊資料,基於vivado的bsp裸機開發。
軟體環境:vivado2015.4,系統自帶bsp,arm核自帶iic介面,不用axi_iic。
硬體環境:zedboard rev.d,希科電子
1.adau1761需要先提供乙個mclk,zedboard上這個mclk由pl提供。所以可以例化乙個pll。目前mclk是24mhz。
2.系統提供的例程xiicps_intr_master_example.c,ver 1.00a,發出的從裝置位址左移了一位,比如adau1761位址是0x76(0111_0110),實際傳送的位址是0xec(11101100),只有將位址右移一位改為0x3b才可以傳送成功。
3.當從裝置位址寫入0x76後,傳送無應答,軟體讀取iic從位址暫存器結果是0x76,但示波器仍然顯示0xec,無應答。
問題一解決,從裝置位址只能寫無讀寫位的位址。比如adau1761位址是0111_0a1a0(r/w),從位址只擷取高7位。zedboard上a1a0是11,則高7位為0111_011,十六進製制為0x3b。在呼叫bsp裡master_send/recv函式時,從裝置位址只寫0x3b。
相關原因見下面截圖
從裝置位址暫存器只使用低7位。
控制暫存器有暫存器位表示是發還是收。
在設定好前七位位址的暫存器後,其他暫存器會寫入失敗,比如寫0x08位址,讀取出來發現寫到了0x0d上。
前7位暫存器都可以正常寫入、讀取。
如下圖,0x00到0x07寫入讀取正常。但計畫寫入0x0a的0x01被寫到了0x0f,後面順延。0x19暫存器的0x13被寫入到了0x1e。
從0x08開始,資料被順延5個暫存器寫入。
解決辦法:adau1761讀取內部iic暫存器時,不要在讀取完pll相關暫存器後連續讀後續的暫存器。要停止一次。比如要讀取所有暫存器的值並存下來,要先連續讀取完0x00到0x07的暫存器,然後再重新發起一次連續讀操作,讀取剩下的暫存器。
C 17 6 lambda擴充套件
自從c 17開始,如果lambda表示式符合要求的話,該表示式會隱式轉換為constexpr表示式。表示式內沒有靜態變數,沒有虛函式,沒有 try catch語句,沒有new delete關鍵字 如下 auto squared auto val 隱式轉換為constexpr表示式,即可以在編譯器求值...
NYOJ 176 整數劃分(二)
整數劃分 二 時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述把乙個正整數m分成n個正整數的和,有多少種分法?例 把5分成3個正正數的和,有兩種分法 1 1 3 1 2 2 輸入第一行是乙個整數t表示共有t組測試資料 t 50 每組測試資料都是兩個正整數m,n,其中 1 n m...
DP NYOJ 176 整數劃分 二
整數劃分 二 dp 解決問題 把乙個正整數m分成n個正整數的和,有多少種分法?解決方法 dp i j 代表 m為i,並分成j個正整數的和時的分法。初始化 dp i 1 1。遞推式 dp i j dp i 1 j 1 有1的情況 dp i j j 沒有1的情況 include include incl...