2014年7月20日日曜日

初代Pasopiaで動かない

MRAMのRAM PAC2を初代パソピアで試したところ、読み書きが失敗する。
ロジアナで、波形を確認してみる。


OUTとIN命令を続けて実行すると、以下のようになった。
上が初代パソピア、下がパソピア7

初代パソピアの方は、CSEL2がLowになってから、CWRもしくはCRDがLowになるまで、約230ns程度の遅延がある。

ポーリング中のアルゴリズムを見直した。
RAMPAC_PORT_SET:
  out _SFR_IO_ADDR(PORTA), r25 ; r25の返答値をセット         ; clock=1
RAMPAC_SCAN_POLLING:
  sbis _SFR_IO_ADDR(PIND), PD4 ; PD4=1(CWR=High)でスキップ     ; clock=1/2,3
  rjmp RAMPAC_NOT_READ_DATA ; RAMPAC_NOT_READ_DATAへ   ; clock=2
  sbic _SFR_IO_ADDR(PIND), PD3 ; PD3=0(CRD=Low)でスキップ     ; clock=1/2,3
  rjmp RAMPAC_SCAN_POLLING ; RAMPAC_SCAN_POLLINGへ    ; clock=2

RAMPAC_READ_DATA:
  sbic _SFR_IO_ADDR(PIND), PD2 ; PD2=0(CSEL2=Low)でスキップ    ; clock=1/2,3
  rjmp RAMPAC_SCAN_POLLING ; RAMPAC_SCAN_POLLINGへ戻る  ; clock=2
  ;PD2=0(CSEL2=Low)でPD3=0(CRD=Low)の場合 = PasopiaのIN命令
  out _SFR_IO_ADDR(DDRA), r19 ; PA0-PA7 : Output(0xFF)        ; clock=1
RAMPAC_WAIT_READ_DATA:
  sbis _SFR_IO_ADDR(PIND), PD2 ; PD2=0(CSEL2=High)でスキップ    ; clock=1/2,3
  rjmp RAMPAC_WAIT_READ_DATA ; RAMPAC_WAIT_READ_DATAへ戻る ; clock=2
  ; CSEL2=Highになったら、PinAをInputに戻す
  out _SFR_IO_ADDR(PORTA), r19 ; PA0-PA7 : Enable pull-up        ; clock=1
  out _SFR_IO_ADDR(DDRA), r18 ; PA0-PA7 : Input(0x00)          ; clock=1
  rjmp RAMPAC_SCAN_POLLING ; RAMPAC_SCAN_POLLINGへ戻る   ; clock=2

RAMPAC_NOT_READ_DATA:
  ;PD2=0(CSEL2=Low)でPD4=0(CWR=Low)の場合 = PasopiaのOUT命令
  in r23, _SFR_IO_ADDR(PIND)                                                        ; clock=1
  in r24, _SFR_IO_ADDR(PINA) ; PinAから入力                                   ; clock=1
  andi r23, 0b00011111                                                                  ; clock=1
  cpi r23, 0b00001011                                                                    ; clock=1
  breq RAMPAC_PIO_CONTROL ; OUT &H1B -> PIO_CONTROLへ        ; clock=1/2
  cpi r23, 0b00001000                                                                    ; clock=1
  breq RAMPAC_SET_LOW_ADDRESS ; OUT &H18 -> SET_LOW_ADDRESSへ ; clock=1/2
    cpi r23, 0b00001010                                                      ; clock=1
    breq RAMPAC_SET_HIGH_ADDRESS ; OUT &H19 -> SET_HIGH_ADDRESSへ ; clock=1/2
    cpi r23, 0b00001001                                                     ; clock=1
    breq RAMPAC_WRITE_DATA ; OUT &H1A -> WRITE_DATAへ            ; clock=1/2
    rjmp RAMPAC_SCAN_POLLING                                             ; clock=2

・・・

今までは、CSEL2がLowになるまでポーリングして待っていたが、今回はCWRかCRDがLowになるまでポーリングで待つようにした。

IN命令の応答は、前回でもぎりぎりのタイミングだったが、今回ポーリング間隔が広くなってしまったので、応答が間に合うように、ロジックを工夫。
ポーリングに入る前に、PortAの出力値を事前にセットしておき、1clock分を節約するとか。

これで、初代パソピアでも動くようになった。

0 件のコメント:

コメントを投稿