2024 04,26 14:58 |
|
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
|
2012 04,01 01:19 |
|
最近、部屋のフローリングが痛んできたのでカーペットを購入して敷きました。
いいですね~、足の冷えが軽減されてパソコン作業が楽になりました(^^) そういや、もう4月ですね~。早い早い。 気候も暖かくなって過ごしやすくなってきました。 愛知県ってもうそろそろ桜が咲くとかどうとか。花見でもしてみようかな。 さて、本題。 今回は、C18に搭載?されているソフトウェアI2Cの動作テストを行いました。 正直使い方がよく分からない上資料も無いので前から手を付けていませんでした。 資料が無いのでどうしようかと思い・・・「自分でソースファイル全部読みゃ良いじゃんww」という結論に。 ちゃちゃっと読んでみると・・・そのまんまでしたねw I/Oポートと各種遅延時間を設定してあげたら動きました。 色々やってますけど、ちゃんと100kHz・400kHzで動いてません・・・。一応動作したので載せときます。 I/OポートからH信号を出力する際に、ポートを入力にしてH信号を出力していた方法は「こんなやり方もあるのか~」とちょっと目から鱗。 今後も利用できるよう汎用的に使えるファイル一式を作成しました。 圧縮したものがこちら。(2012年4月5日変更しました) なおテストの際、PIC18F4550を利用しました。動作クロックは48[MHz]です。 SDA = RC0 SCL = RC1 となっています。 また、今回のテストでは単バイト受信しか行なっていないので、他の関数は動作しない可能性があります。 近々修正して上げる予定ですので。 圧縮ファイル内には ・SW_I2Cフォルダ(I2C各種制御) ・sw_i2c_eep_my.h(I2CEEPROM処理) ・i2c_data.h(I2C用変数宣言) が入っています。 これをそのままメインのソースファイルがあるフォルダにコピーします。 プログラム内で #include "SW_I2C/sw_i2c_my.h" と宣言してやればSW_I2C関連の制御が一式行えます。 私が作成したSW_I2Cですが、 ①通信速度設定 ②SDA・SCLピンの設定 ③遅延時間の設定 の設定を事前にを行います。 まず、SW_I2Cフォルダ内sw_i2c.hで①と②の設定です。 ①15~17行目 使う通信速度のコメントを消して下さい。 /*使用する通信速度のコメント消去*/ //#define SPEED_100K /*100kbps*/ #define SPEED_400K /*400kbps*/ ②23~33行目 使用したいI/Oポートを記述してください。 /*DATAピン設定*/ #define DATA_LOW TRISCbits.TRISC0 = 0; // define macro for data pin output #define DATA_HI TRISCbits.TRISC0 = 1; // define macro for data pin input #define DATA_LAT LATCbits.LATC0 // define macro for data pin latch #define DATA_PIN PORTCbits.RC0 // define macro for data pin /*CLKピン設定*/ #define CLOCK_LOW TRISCbits.TRISC1 = 0; // define macro for clock pin output #define CLOCK_HI TRISCbits.TRISC1 = 1; // define macro for clock pin input #define SCLK_LAT LATCbits.LATC1 // define macro for clock pin latch #define SCLK_PIN PORTCbits.RC1 // define macro for clock pin 次に、SW_I2Cフォルダ内sw_i2c_delay.hで③の設定です。 遅延時間ですが通信速度の半周期を設定時間としています。 100[kbps]の場合、10[us] / 2 = 5[us] 400[kbps]の場合、2.5[us] / 2 = 1.25[us] が設定時間です。 sw_i2c_delay.h内には ・SWDelayI2C ・SWDelayI2C_LO ・SWDelayI2C_HI の3種類の遅延関数があります。 実際のところ、送受信時の各種処理時間によって計算と実測の値が異なってきます。 そのため、実測値を100[kbps] or 400[kbps]にするために遅延時間を短くした遅延関数を作成してあり、SW_DelayI2C_LOとSW_DelayI2C_HIがそうです。 SW_DelayI2Cは計算値そのままの遅延関数です。 別に、全て計算値でも動作はするのでそこら辺はお好みでどうぞ。 今回の動作テストでは、I2C通信のEEPROM 24LC256を利用しました。 プログラムは圧縮ファイル内のsw_i2c_eep_my.hです。 ①読み込みプログラム /*=====I2C EEPROM 読み込み=====*/ unsigned char S_EE_Read(char chip, unsigned int address){ unsigned char data; SWStartI2C(); SWWriteI2C((0xA0 | ((chip & 0x07) << 1)) & 0xFE); SWAckI2C(); SWWriteI2C(address >> 8); SWAckI2C(); SWWriteI2C(address & 0xff); SWAckI2C(); SWRestartI2C(); SWWriteI2C((0xA0 | ((chip & 0x07) << 1)) | 0x01); SWAckI2C(); data = SWReadI2C(); SWAckI2C(); SWStopI2C(); return (data); } ②書き込みプログラム /*=====I2C EEPROM 書き込み=====*/ void S_EE_Write(char chip, unsigned int address ,unsigned char data){ SWStartI2C(); SWWriteI2C((0xA0 | ((chip & 0x07) << 1)) & 0xFE); SWAckI2C(); SWWriteI2C(address >> 8); SWAckI2C(); SWWriteI2C(address & 0xff); SWAckI2C(); SWWriteI2C(data); SWAckI2C(); Delay100TCYx(75); /*wait 3ms*/ SWStopI2C(); } ※2012年4月5日更新 圧縮フォルダにi2c_data.hが入っていなかったので追加しました。 ※2012年4月24日更新 sw_i2c_eep_my.hのS_EE_Write関数を修正しました。 PR |
|
コメント |
コメント投稿 |
|
忍者ブログ [PR] |