作者escorpion (单程车票)
看板ASM
标题[问题] Arduino SPI 使用语法的问题
时间Thu Nov 21 14:35:59 2013
各位大大午安,
自从前天开始接触Arduino这个东西後,
便开始被他多样的功能给吸引住,
而网路上丰富且循序渐进的资料让从没学过C语言的我也能很顺利的上手。
顺便推荐一下这两天我所看觉得非常棒的网站:
1.
https://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吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.109.112.200
1F:→ kdjf: + 是or, SPE/MSTR是你一开始include library时拿来用的 11/21 14:45
2F:→ kdjf:00001111就变成一千一百一十一了... 11/21 14:46
3F:→ kdjf:0b00001111是一个二进位数,十进里的15 11/21 14:47
这里我了解了,原来是在二进位时开头必须加入的字! 感谢指引方向~
不过在SPE/MSTR这里我还是不懂....
你的意思是一开始include的library里就有预先定义好的吗?
我刚看了一下程式码一开始只有include SPI.h,
点进去看也没看到 SPE, MSTR 或 SPSR, SPDR相关的定义....
※ 编辑: escorpion 来自: 140.109.112.200 (11/21 15:30)
4F:→ alibuda174:SPSR在arduino/hardware/tools/avr/avr/include/avr里 11/21 17:39
5F:→ alibuda174:这些都是AVR微控制器的暂存器名称 11/21 17:39
谢谢你的回答!
在进去那个资料夹点了几个标头档还是没发现那几个字的定义後我放弃了.....冏
不过一结果来看我应该可以假设他们分别是6与4这两个值,
并且被已经被定义在某处了吧?
再来是如果我想要写01010000进SPSR,
可以直接写成 : SPSR=B01010000就好吗?
※ 编辑: escorpion 来自: 140.109.112.200 (11/21 22:37)
6F:→ kikiqqp:1. SPCR、SPSR、SPDR所指定的暂存器位址写在 iom8.h 11/22 10:18
7F:→ kikiqqp:2. 你可以直接给予数值 11/22 10:18
9F:→ kikiqqp:SPCR 11/22 10:20
10F:→ kikiqqp:| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 11/22 10:20
11F:→ kikiqqp:| SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 |SPR0 11/22 10:20
12F:→ kikiqqp:SPIE - Enables the SPI interrupt when 1 11/22 10:21
13F:→ kikiqqp:SPE - Enables the SPI when 1 11/22 10:21
14F:→ kikiqqp:DORD - Sends data least Significant Bit First when 1, 11/22 10:21
15F:→ kikiqqp:most Significant Bit first when 0 11/22 10:21
16F:→ kikiqqp:MSTR - Sets the Arduino in master mode when 1, slave 11/22 10:22
17F:→ kikiqqp:mode when 0 11/22 10:22
18F:→ kikiqqp:CPOL - Sets the data clock to be idle when high if set 11/22 10:22
19F:→ kikiqqp:to 1, idle when low if set to 0 11/22 10:22
20F:→ kikiqqp:CPHA - Samples data on the falling edge of the data 11/22 10:22
21F:→ kikiqqp:clock when 1, rising edge when 0 11/22 10:23
22F:→ kikiqqp:SPR1 and SPR0 - Sets the SPI speed, 00 is fastest 11/22 10:23
23F:→ kikiqqp:(4MHz) 11 is slowest (250KHz) 11/22 10:23
24F:→ kikiqqp:以上宣告在 io2333.h 11/22 10:25
太感谢了!我刚刚终於在里面找到了!
※ 编辑: escorpion 来自: 140.109.112.200 (11/22 12:49)