Re: 請教 30F2020的SPI問題
|
||||
---|---|---|---|---|
新會員
|
我了解了,非常的感謝你
謝謝你所有的回覆,幫了我很大的忙。
發表於: 2008/12/26 20:49
|
|||
|
Re: 請教 30F2020的SPI問題
|
||||
---|---|---|---|---|
新會員
|
非常謝謝你,問題解決了,不過我還有一個小問題想要請教一下:
是不是在cs為low的時間內,這3筆資料就可以看成是連續的?因為結果有點像是這樣: (抱歉圖無法上傳,我用簡圖表示) cs  ̄ ̄|_____________________| ̄ ̄ sck(clock) ____| ̄|_____| ̄|_______| ̄|_____ (假設這裡是8bit) (假設這裡是8bit) (假設這裡是8bit) SDO ____| ̄|_____| ̄|_______| ̄|_____ (假設這有data) (假設這有data) (假假設這有data) 每個byte間都有時間差,這樣子外部的device會把這3個byte視為是連續的嗎?
發表於: 2008/12/26 11:24
|
|||
|
Re: 請教 30F2020的SPI問題
|
||||
---|---|---|---|---|
中級會員
|
在以下這裡會造成問題.
/*設置SPI中斷*/ IFS0bits.SPI1IF = 0 ; //未產生中斷 IEC0bits.SPI1IE = 1 ; //允許中斷 IPC2bits.SPI1IP = 4 ; //中斷優先權 = 4 ----------------------------------------------- 因為在你的程式中很明顯的並未使用 spi 中斷程序, 所以如果你開啟了中斷致能會使得 MCU 進入 SPI 中斷裡面, 導致錯誤發生, 應該改為不致能進入 SPI 中斷程序. /*設置SPI中斷*/ IFS0bits.SPI1IF = 0 ; //未產生中斷 IEC0bits.SPI1IE = 0 ; //不致能進入中斷處理程序 IPC2bits.SPI1IP = 4 ; //中斷優先權 = 4
發表於: 2008/12/26 7:04
|
|||
|
Re: 請教 30F2020的SPI問題
|
||||
---|---|---|---|---|
新會員
|
大大,感謝你的指正,可是我試了之後,結果還是不行
是不是我還有什麼地方沒注意到?因為我看了datasheet之後 我不知道我還要設定些什麼? 都只能傳送一個byte而已 void init_SPI() { /*設置SPI中斷*/ IFS0bits.SPI1IF = 0 ; //未產生中斷 IEC0bits.SPI1IE = 1 ; //允許中斷 IPC2bits.SPI1IP = 4 ; //中斷優先權 = 4 /*設置SPI1CON*/ SPI1CON1bits.DISSDO = 0 ; //SDO由SPI module控制 SPI1CON1bits.MODE16 = 0 ; //0是8bit 1是16bit SPI1CON1bits.SPRE = 2 ; //輔助除頻器 6:1(2) SPI1CON1bits.PPRE = 3 ; //主要除頻器 1:1(3) ,SPI速度 = 5Mbps SPI1CON1bits.DISSCK = 0 ; //enable SPI clock SPI1CON1bits.CKP = 0 ; /SPI1CON1bits.CKE = 0 ; SPI1CON1bits.SMP = 0 ; //SDI有輸入時,為中間採樣 SPI1CON1bits.MSTEN = 1 ; //設置為MASTER /*設置SPI1STAT*/ SPI1STATbits.SPIROV = 0 ; //接收未發生溢位標誌 SPI1STATbits.SPISIDL = 1 ; //閒置時繼續工作 SPI1STATbits.SPIEN = 1; //enable SPI }
發表於: 2008/12/25 23:54
|
|||
|
Re: 請教 30F2020的SPI問題
|
||||
---|---|---|---|---|
中級會員
|
你好! 還有問題的話請你試試如下:
------------------------------------------------------------------------------------- int spi_char; cs = low; _SPI1IF = 0; SPI1BUF = 0X02 ; //先傳指令 while(_SPI1IF == 0); _SPI1IF = 0; // 清除 SPI 中斷旗號 spi_char = SPI1BUF; SPI1BUF = 0X01 ; //再傳address while(_SPI1IF == 0); _SPI1IF = 0; // 清除 SPI 中斷旗號 spi_char = SPI1BUF; SPI1BUF = 0X33 ; //最後是data while(_SPI1IF == 0); // _SPI1IF = 0; // 清除 SPI 中斷旗號 spi_char = SPI1BUF; cs = hi; ------------------------------------------------------------------------------------- 加上這個讀取動作, 這是因為 dspic30F 的 spi 是一個雙向動作的模組, 如果沒有讀出的動作時, 會有讀入資料溢位的錯誤產生, 或許是讀入資料的溢位錯誤導致新的資料輸出無動作吧!
發表於: 2008/12/25 22:21
|
|||
|
Re: 請教 30F2020的SPI問題
|
||||
---|---|---|---|---|
新會員
|
感謝你的回覆,我把程式改了,可是還是出現一樣的問題,
沒辦法將3個byte連續丟出去。此外,還有一些疑問: 1.我的clock會多跑出一個,這樣是正常的嗎? 2.我試過傳送8 or 16 bit 最後一個clock總是跟cs從low變hi是差2.6μs? 抱歉,圖好像無法上傳,所以沒有貼圖。
發表於: 2008/12/25 17:10
|
|||
|
Re: 請教 30F2020的SPI問題
|
||||
---|---|---|---|---|
中級會員
|
你好! 你現在的程式中有個不太對的地方,
if (!SPI1STATbits.SPITBF); //再次確定已傳送出去 在這裡應該使用 while(SPI1STATbits.SPITBF); 因為 SPI 的傳送動作是需要時間的, 以你的原方式則不會等待到 SPI 資料傳遞到 SPIxSR. ------------------------------------------------------------------------------------- cs = low; SPI1BUF = 0X02 ; //先傳指令 while(SPI1STATbits.SPITBF); // 若 SPITBF == 1表示未傳出, 需等待 SPI1BUF = 0X01 ; //再傳address while(SPI1STATbits.SPITBF); // 若 SPITBF == 1表示未傳出, 需等待 SPI1BUF = 0X33 ; //最後是data while(SPI1STATbits.SPITBF); // 若 SPITBF == 1表示未傳出, 需等待 cs = hi; ------------------------------------------------------------------------------------- 另外, 當 SPI 以 master 模式使用時, 在 SPI 傳送結束時會產生中斷旗號 (_SPI1IF = 1) 可以判斷 _SPI1IF 來知道 SPI 傳送是否要結束了, 或是要接著傳下一個資料出去. cs = low; _SPI1IF = 0; SPI1BUF = 0X02 ; //先傳指令 while(_SPI1IF == 0); _SPI1IF = 0; // 清除 SPI 中斷旗號 SPI1BUF = 0X01 ; //再傳address while(_SPI1IF == 0); // SPI1BUF = 0X33 ; //最後是data while(_SPI1IF == 0); // _SPI1IF = 0; // 清除 SPI 中斷旗號 cs = hi; ------------------------------------------------------------------------------------- GOOD LUCK !!!!!
發表於: 2008/12/25 11:10
|
|||
|
請教 30F2020的SPI問題
|
||||
---|---|---|---|---|
新會員
|
各位大大,我想用SPI傳出連續3個byte的資料,可是一直都沒辦法做出來,用示波器去量,只有第1個byte會出現,第2、3個都沒有,為什麼連續寫入SPI1BUF是沒有用的?
假設我想"連續"傳出 0x02 0x01 0x33 int main() { TRISAbits.TRISA9 = 0; //定義RA9是cs一為output LATAbits.LATA9 = 1; //讓cs則一開始是HI while(1) { cs = low; SPI1BUF = 0X02 ; //先傳指令 if (!SPI1STATbits.SPITBF); //再次確定已傳送出去 SPI1BUF = 0X01 ; //再傳address if (!SPI1STATbits.SPITBF); // SPI1BUF = 0X33 ; //最後是data if (!SPI1STATbits.SPITBF); // cs = hi; } Attach file: (0.00 KB)
發表於: 2008/12/24 0:22
|
|||
|