2008/12/08

NXTのセンサでリードデータが0〜127の場合にエラーになる原因がわかった。 通常I2Cのリード動作の場合、最後のデータのときマスタはNACKを返すはずだが どうもNXTはACKを返すようだ。 スレーブ(PSoC)側はACKが返ってきたので次のデータを用意するのだが マスタ(NXT)はSTOPを発行するつもりでSCKをHighにする。 スレーブ(PSoC)側はSCKがHighになったのでデータのbit7をSDAに出力する。 そのときbit7が0の場合、SDAがLowになるので 「マスタはSTOPを発行できない」「スレーブは読み出しデータを出力している最中」 だと思ってお互いに止まってしまうようだ。

スレーブ(PSoC)側も関数でリードデータの長さを指定しているのだけど、 どうもその値で次のリードデータを用意する必要があるのかないのかは とくに判定していないようです。(ACK, NACKのみで判断)

I2CHWINT.asmの一部引用

I2C_EvaluateACKIN:
    tst reg[I2CHW_SCR], I2C_LST_BIT
    jnz I2C_LastByteToMstr
    mov A, ( I2C_TX )
        push A
        jmp I2C_ObtainReadData

-- snip --

I2C_ObtainReadData:
    tst  [I2CHW_RsrcStatus],I2CHW_READFLASH
    jz   ReadRamData

-- snip --

ReadRamData:
IF SYSTEM_LARGE_MEMORY_MODEL
   mov   A, [pI2CHW_Read_BufHI]
ENDIF
   RAM_SETPAGE_IDX A
   mov   X, [pI2CHW_Read_BufLO]
   RAM_CHANGE_PAGE_MODE FLAG_PGMODE_10b
   mov   A, [X]
   RAM_CHANGE_PAGE_MODE FLAG_PGMODE_00b
   mov   reg[I2CHW_DR], A
   dec   [I2CHW_Read_Count]
   jc    I2CHW_readOverflow
   inc   [pI2CHW_Read_BufLO]

仕方ないのでリードデータ用のバッファの最後に0xFF(bit7が1ならなんでも良い)を 用意することで回避しました。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-12-08 (月) 17:35:57 (4744d)