山本ワールド
接続されている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.