I2C、SPIなどではシリアルクロックを用います。
AVRマイコン (システムクロックは20MHz)での最速シリアルクロックはどんなものか実験してみました。 下記のプログラム、回路図を用いた結果、写真1のようにハイ100n、ロー200n(3.333MHz) のシリアルクロックが得られました。 ちなみに、クロックのハイの後にNOPを二つ入れると、 写真2のようにハイ200n、ロー200n(2.5MHz)のデューティ50の最速シリアルクロックが得られます。 写真3, 4, 5, 6は別の項目で使用してるものです。 写真4のSDカード、SDカード2で使用しているCLKはシステムクロックが10MHzなので横軸は倍の長さとなってます。 写真6のAVRのSPIで使用しているCLKはハードでシフトしているので速いのです。(CLK = システムクロック20MHz / 2 = 10MHz) デューティ50もハードでシフトしているからでしょう。 ローの期間が長いのは、SPIモード0ではこの期間に次に送るデータを用意したり、 始めに戻ったりしてるためです。 |
C言語
/* * sclk.c * ATmega328P * * * Fuses(システムクロック:20MHz) * * 水晶 * EXTENDED 0xFD * HIGH 0xD9 * LOW 0xF7 */ #include <avr/io.h> #define CK_H PORTB |= _BV(0) #define CK_L PORTB &= ~_BV(0) int main(void) { /* ATmega328系 */ DDRB = 0b00000001; /* XTAL2 XTAL1 SCK MISO MOSI ----- ----- SCLK */ DDRC = 0b00000000; /* xxxxx RESET ----- ----- ----- ----- ----- ----- */ DDRD = 0b00000000; /* ----- ----- ----- ----- ----- ----- ----- ----- */ PORTB = 0b00111110; PORTC = 0b00111111; PORTD = 0b11111111; while(1){ CK_H; /// __asm__ __volatile__("NOP"::); /// __asm__ __volatile__("NOP"::); CK_L; } } アセンブラ .include "m328def.inc" .ORG 0 MAIN: LDI R24, 0b00000001; OUT DDRB, R24; LDI R24, 0b00000000; OUT DDRC, R24; LDI R24, 0b00000000; OUT DDRD, R24; LDI R24, 0b00111110; OUT PORTB, R24; LDI R24, 0b00111111; OUT PORTC, R24; LDI R24, 0b11111111; OUT PORTD, R24; ; SCLK: SBI PORTB, 0; ; NOP; ; NOP; CBI PORTB, 0; RJMP SCLK; |
回路図
写真1 AVRマイコンで作るの最速シリアルクロック (システムクロックは20MHz)
(2V/DIV, 0.2μs/DIV)
写真2 AVRマイコンで作るのデューティ50の最速シリアルクロック (システムクロックは20MHz)
(2V/DIV, 0.2μs/DIV)
写真3 CAN通信で使用してるSCK (システムクロックは20MHz)
(2V/DIV, 0.2μs/DIV)
写真4 SDカード2で使用してるCLK (システムクロックは10MHz)
(1V/DIV, 0.2μs/DIV)
写真5 SDカード3で使用してるCLK (システムクロックは20MHz)
TXS0108Eによる 5V 3.3V レベル変換 上→入力波形、下→出力波形
(2V/DIV, 0.2μs/DIV)
写真6 AVRのSPIで使用してるCLK (システムクロックは20MHz)
(2V/DIV, 0.2μs/DIV)
SPIのタイムチャート
I2Cのタイムチャート
Param. No. | Sym. | Characteristic | Min. | Max. | Units |
---|---|---|---|---|---|
1 | FCLK | Clock frequency | - - | 100 400 | KHz |
2 | THIGH | Clock high time | 4000 600 | - - | ns |
3 | TLOW | Clock low time | 4700 1300 | - - | ns |
4 | TR | SDA and SCL rise time | - - | 1000 300 | ns |
5 | TF | SDA and SCL fall time | - - | 300 100 | ns |
6 | THD:STA | Start condition hold time | 4000 600 | - - | ns |
7 | TSU:STA | Start condition setup time | 4700 600 | - - | ns |
8 | THD:DAT | Data input hold time | 0 | - | ns |
9 | TSU:DAT | Data input setup time | 250 100 | - - | ns |
10 | TSU:STO | Stop condition setup time | 4000 600 | - - | ns |
14 | TBUF | Bus free time:Time the bus must be free bffore a new transmission can start | 4700 1300 | - - | ns |
16 | TSP | input filter spike suppression (SDA and SCL pins) | - | 50 | ns |