小弟目前的程式要控制多的SPI裝置 , 想用巨集來控制各 CHIP_SELECT pin
但是,怎麼宣告都不對,想請教前輩高手該怎麼宣告才好

#define CSB1 P40
#define CSB2 P32
#define CSB3 P33
#define CSB4 P34
#define CSB5 P35

#define __CSBnSEL__(x) (CSB#x)
#define CSBnSEL(x) (__CSBnSEL__(x))

void SPI_init()
{
unsigned char nSEL = 0;

for ( nSEL = 0; nSEL < SPI_DEV_MAX; ++ nSEL )<br>{
CSBnSEL( nSEL )= 0;

/* to do device init */

CSBnSEL( nSEL )= 1;
}
}

文章關鍵字
看起來你這是C語言吧!!

C語言的巨集(Macro)不能這樣用,

巨集會在預先編譯處理做解譯後運算,

變數才能在執行時做運算。

所以你的程式裡的這行:
CSBnSEL( nSEL )= 0;

C compiler會先解譯成:
CSBnSEL = 0;

然後因為CSBnSEL是沒有宣告過的東西,所以compiler會回報有錯誤!!

lininlee wrote:
看起來你這是C語言吧...(恕刪)


是的

我看其他的sample

用了兩層巨集作轉換

其中一層只是把變數轉成數值

就不曉得哪邊有問題

還是說變數沒辦法這樣代換
『 在山的面前,我永遠謙卑;不敢言征服,只願山仁慈 』
中國廚藝學院 wrote:
小弟目前的程式要控制多的SPI裝置 , 想用巨集來控制各 CHIP_SELECT pin
但是,怎麼宣告都不對,想請教前輩高手該怎麼宣告才好
不知學院大找到方法了沒??...
是否又一定要用巨集的方式來控制??...
用其它替代方案是否可以接受...
一樣可用 loop 控制...
只是...要多好幾行程序...
不知可否...
(阿...我是後輩...)
#define CSB1 P40
#define CSB2 P32
#define CSB3 P33
#define CSB4 P34
#define CSB5 P35

void __CSBnSEL1__(unsigned char x);
void __CSBnSEL2__(unsigned char x);
void __CSBnSEL3__(unsigned char x);
void __CSBnSEL4__(unsigned char x);
void __CSBnSEL5__(unsigned char x);
void (*CSBnSEL[2])(unsigned char x) = {__CSBnSEL1__, __CSBnSEL2__, __CSBnSEL3__, __CSBnSEL4__, __CSBnSEL5__};

void SPI_init()
{
unsigned char nSEL = 0;

for ( nSEL = 0; nSEL < SPI_DEV_MAX; nSEL++ )
{
CSBnSEL[nSEL](0);
/* to do device init */
CSBnSEL[nSEL](1);
}
}
void __CSBnSEL1__(unsigned char x)
{
CSB1 = x;
}
void __CSBnSEL2__(unsigned char x)
{
CSB2 = x;
}
void __CSBnSEL3__(unsigned char x)
{
CSB3 = x;
}
void __CSBnSEL4__(unsigned char x)
{
CSB4 = x;
}
void __CSBnSEL5__(unsigned char x)
{
CSB5 = x;
}

josephteng wrote:
不知學院大找到方法了沒??...
是否又一定要用巨集的方式來控制??...
用其它替代方案是否可以接受...
一樣可用 loop 控制...
只是...要多好幾行程序...
不知可否...
(阿...我是後輩...)


本來想法是看能不能用巨集來實作

最後還是用 Function 的方式解決

『 在山的面前,我永遠謙卑;不敢言征服,只願山仁慈 』
中國廚藝學院 wrote:
本來想法是看能不能用巨集來實作
最後還是用 Function 的方式解決
昨日試驗時...
貌似第二行的 define 並沒有預期的效果...把字串轉成數字...
而是直接 pass 給上一行的 define 了...
呼叫阿星...呼叫阿星...
來看看這個有沒有辦法做...
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!