[問題] Arduino SPI 使用語法的問題

作者: escorpion (pavone先生)   2013-11-21 14:35:59
各位大大午安,
自從前天開始接觸Arduino這個東西後,
便開始被他多樣的功能給吸引住,
而網路上豐富且循序漸進的資料讓從沒學過C語言的我也能很順利的上手。
順便推薦一下這兩天我所看覺得非常棒的網站:
1. http://www.youtube.com/watch?v=E3W8Fxc7tHo
這個網站是由Arduino的發展人之一所拍的教學影片,共有10個主題,
從最基本開始讓你慢慢了解這玩意是什麼!
在看到第四個lesson後也有了靈感寫了我的第一支程式,
http://0rz.tw/fdhGW (讓Ardino唱卡農,連結到我的FB影片)
2. http://0rz.tw/2akCj
這個網站裡的Arduino Tutorials 目前共有57個chapters,而且持續更新中,
藉由做專題的形式來學習Arduino。
打了落落長的廢話我想問的問題是:
a. 我在看了Arduino官網裡關於使用SPI寫EEPROM的文章後一直卡在一個地方,
網路上找了很多資料後還是無法了解....
(http://arduino.cc/en/Tutorial/SPIEEPROM,文章連結)
文章裡其中一段程式碼 :
// SPCR = 01010000
//interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
//sample on leading edge of clk,system clock/4 rate (fastest)
SPCR = (1<<SPE)|(1<<MSTR);
clr=SPSR;
clr=SPDR;
delay(10);
我的理解為我想要在SPI Control Register 裡寫入01010000這個指令,
我不懂的是這串指令要怎麼從(1<<SPE)|(1<<MSTR)產生?
我看程式的一開始沒有宣告SPE與MSTR為何種變數,
為什麼它可以這樣直接使用?
為什麼不能直接寫 : SPCR=01010000就好?
b. 在一個使用SPI控制DAC的範例裡 :
http://0rz.tw/Y9QGW
因為此DAC為12 bit input且需4 bit來做參數設定,
由於SPI只能做byte的傳輸,因此範例裡使用的是 highbyte()與lowbyte()兩指令,
將一個16 bit的變數分成兩部分寫入DAC,
其中包含參數設定的那部分使用了bitmask來使得該4 bit永遠為固定值。
部分程式碼為 :
word outputValue = 0; // a word is a 16-bit number
byte data = 0; // and a byte is an 8-bit number
void loop()
{
for (int a=0; a<=4095; a++)
{
outputValue = a;
digitalWrite(10, LOW);
data = highByte(outputValue);
data = 0b00001111 & data;
data = 0b00110000 | data;
SPI.transfer(data);
data = lowByte(outputValue);
SPI.transfer(data);
digitalWrite(10, HIGH);
delay(del);
}
這裡我不懂的地方是在bitmask裡0b00001111 or 0b00110000 為什麼會多出0b?
不能直接寫00001111 or 00110000嗎?
作者: kdjf (我抓得到什麼呢?)   2012-01-21 14:45:00
+ 是or, SPE/MSTR是你一開始include library時拿來用的00001111就變成一千一百一十一了...0b00001111是一個二進位數,十進裡的15
作者: alibuda174 (阿哩不達)   2012-01-21 17:39:00
SPSR在arduino/hardware/tools/avr/avr/include/avr裡這些都是AVR微控制器的暫存器名稱
作者: kikiqqp (喵食罐頭)   2012-01-22 10:18:00
1. SPCR、SPSR、SPDR所指定的暫存器位址寫在 iom8.h2. 你可以直接給予數值3. http://arduino.cc/en/Tutorial/SPIEEPROMSPCR| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0| SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 |SPR0SPIE - Enables the SPI interrupt when 1SPE - Enables the SPI when 1DORD - Sends data least Significant Bit First when 1,most Significant Bit first when 0MSTR - Sets the Arduino in master mode when 1, slavemode when 0CPOL - Sets the data clock to be idle when high if setto 1, idle when low if set to 0CPHA - Samples data on the falling edge of the dataclock when 1, rising edge when 0SPR1 and SPR0 - Sets the SPI speed, 00 is fastest(4MHz) 11 is slowest (250KHz)以上宣告在 io2333.h

Links booklink

Contact Us: admin [ a t ] ucptt.com