概要

I2C接続されたスレーブアドレスの一覧をRS232Cへ出力します。
パソコン側ではターミナルソフト(例えばTera Termなど)を使用します。

ターミナルソフトの設定

ボー・レート 19200
データ 8bit
パリティ 無し
ストップ 1bit
フロー制御 無し

ターミナルソフト受信例

以下のデバイスが接続されている場合
0xa2 RTC8564
0xa6 ADXL345
0xa8 EEP-ROM 1スタートアドレス
0xac EEP-ROM 2スタートアドレス
受信例
I2C ADS List
ADS a2
ADS a6
ADS a8
ADS aa
ADS ac
ADS ae
end
回路は次のとおりである。
回路図(PNG) 回路図(PDF) 回路図(DXF)

プログラムの説明

ソースファイル

以下のファイルで構成されている
i2clistc.c・・・ メインプログラム

ソースファイルのダウンロード i2clistc.zip

i2clistc.c

USART、I2Cモジュールの初期化後、アドレス2おきにSTARTコンディションを発行後、スレーブアドレスを送信、ACKがあれば接続されているのでRS232Cにアドレスを出力後 STOPコンディションを発行する。

/*
 * 接続されているI2Cスレーブアドレスを検出しRS232Cへ出力 Version 1.00
 * File:        i2clistc.c
 * Target:      PIC18F14K50 48MHz
 * コンパイラ:   Microchip MPLAB XC8 C Compiler V1.20
 * 書き込み:     PICKit 3
 * リリース:     2013/10/09 22:00
 *
 * 接続されているI2Cデバイスのスレーブアドレスの一覧をRS232Cで出力(19200bps パリティ無 フロー制御無)
 *   RS232C出力例
 *     I2C ADS List
 *     ADS a2
 *     ADS a6
 *     ADS a8
 *     ADS aa
 *     ADS ac
 *     ADS ae
 *     end
 *
*/

#include <stdio.h>
#include <stdlib.h>
#include <p18f14k50.h>
#include <plib\delays.h>
#include <plib\i2c.h>
#include <plib\usart.h>

#pragma config  FOSC = HS,CPUDIV = NOCLKDIV,PLLEN=ON,WDTEN=OFF,LVP=OFF,MCLRE=OFF

signed char i2c_write(unsigned char d){
    signed char ret;
    ret=WriteI2C(d);
    IdleI2C();
    return ret;
}

signed char i2c_ads(unsigned char sads){
    signed char ret;
    unsigned char try=2;

    do{
        SSPCON1bits.WCOL=0;
        IdleI2C();
        StartI2C();
        while(SSPCON2bits.SEN);
        if(--try == 0)
            return -1;
    }while(ret=i2c_write(sads));    //  アクノリッジがない場合はbusyなので返答があるまで待機

    StopI2C();
    while(SSPCON2bits.PEN);
    return ret;
}

char buf[16];

void main(void) {
    unsigned char data;
    OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH,155);
    OpenI2C(MASTER,SLEW_ON);    // マスター
    SSPADD=230;
    Delay1KTCYx( 255);  //  213ms*(48MHz/4)=  2,550,000
    putrsUSART("I2C ADS List\n\r");
    for(unsigned int n=0;n<256;){
        if(i2c_ads(n)==0){
            sprintf(buf,"ADS %x\n\r",n);
            putsUSART(buf);
        }
        n+=2;
    }
    putrsUSART("end\n\r");
    while(1);

}