全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1917
推到 Plurk!
推到 Facebook!

keil C 一問

答題得分者是:addn
sissy
一般會員


發表:1
回覆:1
積分:0
註冊:2006-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-23 14:04:21 IP:220.134.xxx.xxx 訂閱
小弟的硬體有兩顆使用SPI傳輸的IC
接法是DIN,DO,CLK 為共用 而兩顆IC的CS腳各別獨立
設定如下
sbit DIN = P2^0 ;
sbit DO = P2^1 ;
sbit CLK = P2^2 ;
sbit CS1 = P2^3 ;
sbit CS2 = P2^4 ;


而小弟也把SPI的Function寫出來了
然而原本是把CS的控腳寫在SPI裡面如下
部分code

[code cpp]

void main()
{
unsigned char cx;
cx = ReadByte(0x10);
...
...
}
...
...
...
unsigned char ReadByte(unsigned char Addr)
{
unsigned char i,ch=0;
CS1=1;
DI= 1;
Clock();
DI= 1;
Clock();
DI= 0;
Clock();
...
...
...
CS1= 0;
return ch;
}
[/code]

但問題來了,這樣的SPI function並不夠完美
因為需要寫兩個獨立的SPI function @_@
小弟也試著把它改成如下


[code cpp]
void main()
{
unsigned char cx;
cx = ReadByte(CS1,0x10);
...
...
}
...
...
...
unsigned char ReadByte(bit CS,unsigned char Addr)
{
unsigned char i,ch=0;
CS=1;
DI= 1;
Clock();
DI= 1;
Clock();
DI= 0;
Clock();
...
...
...
CS= 0;
return ch;
}
[/code]
但不行..是傳值呼叫的問題吧.
那要怎麼改成傳址呼叫呢??
還是應該如何改進呢?
才能讓這個Function能共用??
以上..
編輯記錄
sissy 重新編輯於 2008-03-23 14:06:11, 註解 無‧
addn
高階會員


發表:64
回覆:221
積分:202
註冊:2005-03-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-23 17:30:09 IP:218.171.xxx.xxx 訂閱
您好

你的程式看起來怪怪的(把CS1指定給參數CS)
你CS1不是輸出嘛

其實寫成兩個讀取的副程式,也沒甚不好,如果堅持要合併可以試試以下


讀取IC1
cx = ReadByte(0,0x10);

讀取IC2
cx = ReadByte(1,0x10);



unsigned char ReadByte(bit CS,unsigned char Addr)
{
unsigned char i,ch=0;

if(CS==0)
CS1=1;
else
CS2=1;

DI= 1;
Clock();
DI= 1;
Clock();
DI= 0;
Clock();
...
...
...
CS1= 0;
CS2=0;
return ch;
}
sissy
一般會員


發表:1
回覆:1
積分:0
註冊:2006-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-23 20:27:52 IP:220.134.xxx.xxx 訂閱
在此先謝謝addn 的回答
addn給的方法小弟有用過.是可以
但若是以後換了個電路(假設有3個SPI或更多)是必要再改寫一次SPI這個Function

由於小弟是把SPI寫成另一個 .c檔案
就是想說以後不想要再改這支程式
或許小弟太過了 =.=
但不知道有沒有更佳的方式??
===================引 用 addn 文 章===================
您好

你的程式看起來怪怪的(把CS1指定給參數CS)
你CS1不是輸出嘛

其實寫成兩個讀取的副程式,也沒甚不好,如果堅持要合併可以試試以下


讀取IC1
cx = ReadByte(0,0x10);

讀取IC2
cx = ReadByte(1,0x10);



unsigned char ReadByte(bit CS,unsigned char Addr)
{
unsigned char i,ch=0;

if(CS==0)
CS1=1;
else
CS2=1;

DI= 1;
Clock();
DI= 1;
Clock();
DI= 0;
Clock();
...
...
...
CS1= 0;
CS2=0;
return ch;
}
addn
高階會員


發表:64
回覆:221
積分:202
註冊:2005-03-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-03-23 21:03:48 IP:218.171.xxx.xxx 訂閱
您好
其實改一下這副程式也蠻快的
就不要偷懶了啦

SPI也有很多資料長度格式不同的阿
這你就沒辦法用一個副程式來適用所有
的SPI Device,到時候還是得改
系統時間:2024-05-12 23:57:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!