• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
  • slider image 488
  • slider image 491
:::


Browsing this Thread:   1 Anonymous Users






Re: 請教 30F2020的SPI問題
#9
新會員
新會員


查看用戶資訊
我了解了,非常的感謝你

謝謝你所有的回覆,幫了我很大的忙。

發表於: 2008/12/26 20:49
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教 30F2020的SPI問題
#8
中級會員
中級會員


查看用戶資訊
是的, 沒有錯!

即使有些間隔的時間存在, 還是會被當成連續的資料被接收.
不會有任何問題的.

事實上 SPI 可以說根本是以 CK 有無變化為準的.
不但可以有像這樣的間隔時間不會有問題, 即使 CK 並不是等寬的方波也不會有問題發生.
大概只有 CK 的最高速率, HI / LO 的最小維持時間真的需要注意!

發表於: 2008/12/26 20:29
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教 30F2020的SPI問題
#7
新會員
新會員


查看用戶資訊
非常謝謝你,問題解決了,不過我還有一個小問題想要請教一下:
是不是在cs為low的時間內,這3筆資料就可以看成是連續的?因為結果有點像是這樣: (抱歉圖無法上傳,我用簡圖表示)


cs
 ̄ ̄|_____________________| ̄ ̄

sck(clock)

____| ̄|_____| ̄|_______| ̄|_____
(假設這裡是8bit) (假設這裡是8bit) (假設這裡是8bit)

SDO
____| ̄|_____| ̄|_______| ̄|_____
(假設這有data) (假設這有data) (假假設這有data)

每個byte間都有時間差,這樣子外部的device會把這3個byte視為是連續的嗎?

發表於: 2008/12/26 11:24
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教 30F2020的SPI問題
#6
中級會員
中級會員


查看用戶資訊
在以下這裡會造成問題.

/*設置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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教 30F2020的SPI問題
#5
新會員
新會員


查看用戶資訊
大大,感謝你的指正,可是我試了之後,結果還是不行

是不是我還有什麼地方沒注意到?因為我看了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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教 30F2020的SPI問題
#4
中級會員
中級會員


查看用戶資訊
你好! 還有問題的話請你試試如下:

-------------------------------------------------------------------------------------
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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教 30F2020的SPI問題
#3
新會員
新會員


查看用戶資訊
感謝你的回覆,我把程式改了,可是還是出現一樣的問題,
沒辦法將3個byte連續丟出去。此外,還有一些疑問:

1.我的clock會多跑出一個,這樣是正常的嗎?

2.我試過傳送8 or 16 bit 最後一個clock總是跟cs從low變hi是差2.6μs?

抱歉,圖好像無法上傳,所以沒有貼圖。

發表於: 2008/12/25 17:10
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教 30F2020的SPI問題
#2
中級會員
中級會員


查看用戶資訊
你好! 你現在的程式中有個不太對的地方,

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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


請教 30F2020的SPI問題
#1
新會員
新會員


查看用戶資訊
各位大大,我想用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:



jpg  (0.00 KB)


發表於: 2008/12/24 0:22
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------