🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら

Q&A

解決済

2回答

1283閲覧

PICでMCCでのS-35390A(リアルタイムクロック)の実装

lap

総合スコア4

0グッド

0クリップ

投稿2020/11/26 07:00

編集2020/11/27 10:21

前提・実現したいこと

PICでMCCを使ってS-35390A(リアルタイムクロック)を実装したい

発生している問題・エラーメッセージ

I2Cでデータを読み込めない。

該当のソースコード

c

1#include "mcc_generated_files/mcc.h" 2#include "mcc_generated_files/examples/i2c_master_example.h" 3 4uint8_t g_i2c[20]; 5 6/* 7 Main application 8*/ 9void main(void) 10{ 11 // initialize the device 12 SYSTEM_Initialize(); 13 14 // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits 15 // Use the following macros to: 16 17 // Enable the Global Interrupts 18 INTERRUPT_GlobalInterruptEnable(); 19 20 // Enable the Peripheral Interrupts 21 INTERRUPT_PeripheralInterruptEnable(); 22 23 // Disable the Global Interrupts 24 //INTERRUPT_GlobalInterruptDisable(); 25 26 // Disable the Peripheral Interrupts 27 //INTERRUPT_PeripheralInterruptDisable(); 28 29 I2C_ReadNBytes(0x60, &g_i2c[0], 1); 30 // この後にg_i2c[0]に0しか入っていない 31 32 while (1) 33 { 34 // Add your application code 35 } 36}

試したこと

MCCの設定は、
Interrupt Driven:ON
Serial Protocol:I2C
Mode:Master
I2C Clock Frequency(Hz):100000
Enable I2C Interrupt:ON

ピン設定はデフォルトで変更していません。
CCS社のコンパイラでは動作したので配線は問題ありません。

補足情報

MCCで自動生成される「i2c_master_example.h」をインクルードしています。
データシートを確認すると、「マスタデバイスから最後のデータバイトに対しては、アクノリッジ信号を入力しない (NO_ACK) でください。」とあります。そのようなことがMCCで設定可能なのでしょうか?

参考にしたサイト

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

i2c address は、7ビットで指定するのでは?

// I2C_ReadNBytes(0x60, &g_i2c[0], 1); I2C_ReadNBytes(0x30, &g_i2c[0], 1);

参考先
PICマイコンでLED照明を制御する(14)

// スレーブアドレスの設定 #define dfPCA9635_SLVADDR 0x40 // I2C slave write address [7bit] -- (7bit+Write)0x80 / (7bit+Read)0x81

投稿2020/11/27 13:46

koujikuu

総合スコア401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nac_tnk

2020/11/27 15:01

なるほど。其処みたいですね。
lap

2020/11/28 01:13 編集

遅くなってすみません。 今朝さっそく会社にきて該当箇所を修正してみたところ、正常に動作しました! I2Cがどうしても出来なくて数日作業が止まっていたので本当に助かりました。 お二人ともありがとうございます!!
guest

0

MCCは殆ど使った事が無いので、どんなコードが生成されるのかは判りませんけど、

マスタが受信の場合に、ACKを返すのは、「もう1バイト頂戴」の意味合いを含むと思います。
言いたいのは、最後にNACK(=「もういらないよ」)にするというのは標準的なI2Cの動作です。
なので既にそうなっていると推測します。

// この後にg_i2c[0]に0しか入っていない

何故1バイトしか読まないのでしょうか?
そのアドレス(ステータスレジスタ1 )は、通常動作になっている場合は0でもおかしくありません。
※「CCS社のコンパイラでは動作した」と書いてありますから、POCは既にクリアされている可能性があります。
電池とかを抜いて、「確実にパワーダウンさせた後なら」1を読み取る筈です。

いずれにしても、どのような状態のRTCでこのコードを試したのかが判りません。
(本人なら判るでしょうけど)
もしかしたら、ちゃんと動作している(読み込めている)のかもしれません。

もうちょっと読み書きしてみたらどうでしょうか?

投稿2020/11/27 01:18

nac_tnk

総合スコア494

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lap

2020/11/27 05:39 編集

返信ありがとうございます。 >~というのは標準的なI2Cの動作です。 知りませんでした。勉強になりました。ありがとうございます。 >何故1バイトしか~ 実際は他のアドレスの取得・設定も試しています。 #define RTC_STS_1 0x60 /// ステータスレジスタ1 #define RTC_STS_2 0x62 /// ステータスレジスタ2 #define RTC_RTD_1 0x64 /// リアルタイムデータ1 (年月日曜時分秒) #define RTC_RTD_2 0x66 /// リアルタイムデータ2 (時分秒) というような感じで宣言しているのですが、どのアドレスも取得・設定がうまくいかず、まるで動いていないかのように感じます。RTC電圧も3V近く流れていて問題ありません。 MCCの不具合なんですかね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問