山本ワールド
接続されているI2Cスレーブアドレスを検出しRS232Cへ出力
概要
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);
}
      Copyright (C) 2012 山本ワールド All Rights Reserved.
    
    
  