• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

TWIペリフェラルを使ってI2Cプロトコルを制御する


Commit MetaInfo

Revisiona0ae539bc1a6519b5a343da00029cbccaa921eaa (tree)
Time2012-09-09 09:22:32
Authortakemasa <suikan@user...>
Commitertakemasa

Log Message

I2Cの応答時間確保のため、プロトコル実行中の優先順位を引き上げた。また、正常終了時のリターン値にバグがある点を修正した。

Change Summary

Incremental Difference

--- a/i2c-test/i2c_subsystem.c
+++ b/i2c-test/i2c_subsystem.c
@@ -18,7 +18,7 @@
1818 #include <ccblkfn.h>
1919
2020
21-// #define I2C_DEBUG
21+#define I2C_DEBUG
2222
2323 #ifdef I2C_DEBUG
2424 #define I2C_SYSLOG(level,msg) syslog( level, msg )
@@ -100,7 +100,8 @@ int i2c_master_write_read( int peripheral, int slave, unsigned char write_data[]
100100 struct I2C_MASTER_CONTROL_TYPE *twi;
101101 BOOL read, write, rstart, quit;
102102 unsigned char *wptr, *rptr;
103- enum I2C_STATE state; /**< I2Cペリフェラルハンドラの内部状態 */
103+ enum I2C_STATE state; /**< I2Cペリフェラルハンドラの内部状態 */
104+ PRI old_priority; // タスクの優先順位を保存しておくための変数
104105
105106 // 可読性向上のため、TWI管理構造体のポインタを設定する。
106107 twi = &i2c_control[peripheral];
@@ -138,6 +139,10 @@ int i2c_master_write_read( int peripheral, int slave, unsigned char write_data[]
138139 // これでスレッドセーフにできる
139140 wai_sem(twi->blocking);
140141
142+ // タスクの優先順位を一旦引き上げる。これは、TWIのレスポンスを保証するためである
143+ get_pri( TSK_SELF, &old_priority );
144+ chg_pri( TSK_SELF, TMAX_TPRI );
145+
141146 // SPIスレーブデバイスのアドレスを設定(7bit)
142147 *twi->master_addr = slave;
143148
@@ -188,7 +193,7 @@ int i2c_master_write_read( int peripheral, int slave, unsigned char write_data[]
188193 else if ( ( twi->intr_state & MCOMP ) && rstart) // MCOMP かつ RSTARTなら受信へ
189194 state = I2C_RCV_ENTRY;
190195 else if ( twi->intr_state & MCOMP ){ // RSTARTがないMCOMPなら終了
191- twi->intr_state = ~MCOMP;
196+ twi->intr_state &= ~MCOMP;
192197 state = I2C_EXIT;
193198 }
194199 else // それ以外は送信割り込み
@@ -215,7 +220,7 @@ int i2c_master_write_read( int peripheral, int slave, unsigned char write_data[]
215220 if ( twi->intr_state & MERR) // エラーならすぐ終了
216221 state = I2C_EXIT;
217222 else if ( twi->intr_state & MCOMP ){ // 終了ならエラークリア
218- twi->intr_state = ~MCOMP;
223+ twi->intr_state &= ~MCOMP;
219224 state = I2C_EXIT;
220225 }
221226 else // それ以外は受信割り込み
@@ -234,6 +239,9 @@ int i2c_master_write_read( int peripheral, int slave, unsigned char write_data[]
234239 }
235240 } while ( !quit );
236241
242+ // タスクの優先順位を元に戻す
243+ chg_pri( TSK_SELF, old_priority);
244+
237245 // 排他区間の終了
238246 sig_sem(twi->blocking);
239247