シリアルクロック


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;


sclk_kairo.gif

回路図


sclk1_2_0_2.JPG

写真1 AVRマイコンで作るの最速シリアルクロック (システムクロックは20MHz)
(2V/DIV, 0.2μs/DIV)


sclk2_2_0_2.JPG

写真2 AVRマイコンで作るのデューティ50の最速シリアルクロック (システムクロックは20MHz)
(2V/DIV, 0.2μs/DIV)


CAN_SCK_2_0_2.JPG

写真3 CAN通信で使用してるSCK (システムクロックは20MHz)
(2V/DIV, 0.2μs/DIV)


sdc_sdc2_CLK_1_0_2.JPG

写真4 SDカード2で使用してるCLK (システムクロックは10MHz)
(1V/DIV, 0.2μs/DIV)


sdc3_CLK_2_0_2.JPG

写真5 SDカード3で使用してるCLK (システムクロックは20MHz)
TXS0108Eによる 5V 3.3V レベル変換 上→入力波形、下→出力波形
(2V/DIV, 0.2μs/DIV)


avr_spi_CLK_2_0_2.JPG

写真6 AVRのSPIで使用してるCLK (システムクロックは20MHz)
(2V/DIV, 0.2μs/DIV)


SPI_TC.gif

SPIのタイムチャート


EEPROM_TC.gif

I2Cのタイムチャート

I2Cのタイムチャートの値
Param.
No.
Sym.CharacteristicMin.Max.Units
1FCLKClock frequency-
-
100
400
KHz
2THIGHClock high time4000
600
-
-
ns
3TLOWClock low time4700
1300
-
-
ns
4TRSDA and SCL rise time-
-
1000
300
ns
5TFSDA and SCL fall time-
-
300
100
ns
6THD:STAStart condition hold time4000
600
-
-
ns
7TSU:STAStart condition setup time4700
600
-
-
ns
8THD:DATData input hold time0-ns
9TSU:DATData input setup time250
100
-
-
ns
10TSU:STOStop condition setup time4000
600
-
-
ns
14TBUFBus free time:Time the bus
must be free bffore a new
transmission can start
4700
1300
-
-
ns
16TSPinput filter spike suppression
(SDA and SCL pins)
-50ns


真空管
戻る