2015년 4월 2일 목요일

BusPirate로 TinyRTC 사용해보기



BusPirate를 TinyRTC와 연결(3.3V, GND, SCL, SDA) 한 다음 시리얼 터미널을 열어준다. 통신 파라미터는 115200-N81이다.



HiZ>#
RESET

Bus Pirate v3b
Firmware v5.10 (r559) Bootloader v4.4
DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8)
http://dangerousprototypes.com
HiZ>?
General.....Protocol interaction
---------------------------------------------------------------------------
?.This help...(0).List current macros
=X/|X.Converts X/reverse X..(x).Macro x
~.Selftest...[.Start
#.Reset....].Stop
$.Jump to bootloader..{.Start with read
&/%.Delay 1 us/ms...}.Stop
a/A/@.AUXPIN (low/HI/READ).."abc".Send string
b.Set baudrate...123
c/C.AUX assignment (aux/CS)..0x123
d/D.Measure ADC (once/CONT.).0b110.Send value
f.Measure frequency..r.Read
g/S.Generate PWM/Servo../.CLK hi
h.Commandhistory...\.CLK lo
i.Versioninfo/statusinfo..^.CLK tick
l/L.Bitorder (msb/LSB)..-.DAT hi
m.Change mode..._.DAT lo
o.Set output type.....DAT read
p/P.Pullup resistors (off/ON).!.Bit read
s.Script engine...:.Repeat e.g. r:10
v.Show volts/states....Bits to read/write e.g. 0x55.2
w/W.PSU (off/ON)..<x>/<x= >/<0>.Usermacro x/assign x/list all
HiZ>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. 2WIRE
7. 3WIRE
8. LCD
9. DIO
x. exit(without change)

(1)>4
Set speed:
1. ~5KHz
2. ~50KHz
3. ~100KHz
4. ~400KHz

(1)>4
Ready
I2C>(1)
Searching I2C address space. Found devices at:
Warning: *Short or no pull-up

I2C>W
Power supplies ON
I2C>(1)
Searching I2C address space. Found devices at:
0xA0(0x50 W) 0xA1(0x50 R) 0xD0(0x68 W) 0xD1(0x68 R)

I2C를 스캔한 결과 2개의 I2C주소를 사용하고 있는걸 확인할 수 있다. (0x50, 0x68)
하지만 주소 각각에 대해 R, W 주소가 다르게 나온건 I2C는 7비트 주소를 사용하고, 그 주소가 b7~b1까지에 들어가고 b0가 R/W를 나타내기 때문에 0x68인 경우 0b11010000(0xd0)이 0x68에 대한 write, 0b11010001(0xd1)이 0x68에 대한 read가 된다. Realtime Clock칩인 DS1307의 주소는 0x68이다.

DS1307의 레지스터 맵은 다음과 같다.



이제 TinyRTC에 시간을 설정해 보도록 하겠다. 2014년 4월 2일 (목) 오전 11:23:36으로 설정한다.
그러면 실제 레지스터에 넣어줘야 하는 값은 다음과 같다. (바탕이 회색인 부분은 설정에 사용되지 않으므로 무시, 바탕이 노란색인 부분의 볼드체 숫자는 바이너리 값이 아니고 BCD 값임)

AddressB7B6B5B4B3B2B1B0Hex ValueMeaning
0x0
0
3
6
0x3636 (sec), Clock enabled
0x1
0
2
3
0x2323 (min)
0x2
0
1
0
1
1
0x5111 (Hour), 12-hour mode, AM
0x3
0
0
0
0
0
4
0x044th day of the week
0x4
0
0
0
2
0x022 (date)
0x5
0
0
0
0
4
0x044 (month)
0x6
1
4
0x142014 (year)
0x7
0
0
0
0
0
0
0
0
0x00Square-wave disabled
0x8~0x3f









56 bytes RAM
즉 주소 0번지부터 0x36, 0x23, 0x51, 0x04, 0x02, 0x04, 0x14, 0x00을 넣어주면 되는 것이다.
BusPirate에서 다음 명령으로 값을 써 줄 수 있다. 데이터를 write하는 것이기 때문에 I2C 주소로 0xd0를 사용한다.

I2C>[0xd0 0x0 0x36 0x23 0x51 0x04 0x02 0x04 0x14 0x0]
I2C START BIT
WRITE: 0xD0 ACK
WRITE: 0x00 ACK
WRITE: 0x36 ACK
WRITE: 0x23 ACK
WRITE: 0x51 ACK
WRITE: 0x04 ACK
WRITE: 0x02 ACK
WRITE: 0x04 ACK
WRITE: 0x14 ACK
WRITE: 0x00 ACK
I2C STOP BIT

이제 원하는 시간이 설정이 되었고 클럭을 enabled 시켜줬기 때문에 시간이 계속 진행된다. 조금 후 현재 시간을 확인해 보도록 한다. 주소 0x0에서부터 7 바이트를 읽어보면 된다. 주소를 지정하기 위해 0x0을 쓸때는 I2C 주소로 0xd0를 사용하고, 데이터를 읽을때는 I2C 주소로 0xd1을 사용한걸 주의해라.

I2C>[0xd0 0x0]
I2C START BIT
WRITE: 0xD0 ACK
WRITE: 0x00 ACK
I2C STOP BIT
I2C>[0xd1 r r r r r r r]
I2C START BIT
WRITE: 0xD1 ACK
READ: 0x07
READ: ACK 0x25
READ: ACK 0x51
READ: ACK 0x04
READ: ACK 0x02
READ: ACK 0x04
READ: ACK 0x14
NACK
I2C STOP BIT

위의 결과를 분석해 보면 2014년 4월 2일 (목) 오전 11:25:07 이 된다. 설정된 시간에서 약 1분 30초 정도 지난걸 확인할 수 있다.

AddressB7B6B5B4B3B2B1B0Hex ValueMeaning
0x0
0
0
7
0x0707 (sec), Clock enabled
0x1
0
2
5
0x2525 (min)
0x2
0
1
0
1
1
0x5111 (Hour), 12-hour mode, AM
0x3
0
0
0
0
0
4
0x044th day of the week
0x4
0
0
0
2
0x022 (date)
0x5
0
0
0
0
4
0x044 (month)
0x6
1
4
0x142014 (year)
0x7
0
0
0
0
0
0
0
0
0x00Square-wave disabled
0x8~0x3f









56 bytes RAM

또한 위의 두 명령을 아래와 같이 한줄로 써 줄수도 있다.

I2C>[0xd0 0x0 [0xd1 r r r r r r r]
I2C START BIT
WRITE: 0xD0 ACK
WRITE: 0x00 ACK
I2C START BIT
WRITE: 0xD1 ACK
READ: 0x54
READ: ACK 0x30
READ: ACK 0x51
READ: ACK 0x04
READ: ACK 0x02
READ: ACK 0x04
READ: ACK 0x14
NACK
I2C STOP BIT
I2C>



댓글 없음:

댓글 쓰기