おはようございます。
としぶぅ~です。
昨日は雨すごかったですね。。。。会社行くのにびしょびしょになっちゃいました^^;
本日は昨日のつづき・・・
EEPROMのSPIアクセスがうまくいかなかった。。。。が原因が判明しました。
いままで、チェック用にズルズルコード書いていましたが何とか動くようになったのでモジュールにして分けた
とたんにうごかなくなってしまった。。。。
モジュール化したコードをじっと見る・・・・じっと見る・・・・これだ!
どうも1バイト出すごとに”/CS”をアクティブ→アイドル状態にしてました。。。。
これではコマンドがうまく受け付けてもらえません。。。。さっそくコマンド単位で”/CS”がアクティブ→アイドル状態
になるように修正しました。
とりあえず動作することを確認しました。
上記のようにWRENをON→STATUS取り込み→WRENをOFF→STATUS取り込み→データ読み込みを
行いました。
ちゃんとデータが出てきています。(よかった・・・・)
とりあえずモジュール化したコードは下記に書いておきます。
//spiの初期化
void spiinit(unsigned char spimode)
{
/*************************************************
SPIモード
spimode = 0000 :spi-master-mode OSC/4
spimode = 0001 :spi-master-mode OSC/16
spimode = 0010 :spi-master-mode OSC/64
spimode = 0011 :spi-master-mode TMR2 output/2
spimode = 0010 :spi-slave-mode SSpin Disable
spimode = 0010 :spi-slave-mode SSpin Enable
**************************************************/
unsigned char spimode0;
spimode0=(SSPCON & 0xf0) | spimode;
SSPCON=spimode0;
// SSPM=spimode; //SPIモードの設定
CKP=1; //送信up-受信down
SMP=0; //データを真ん中で取り込む
CKE=0; //アイドル→アクティブ
//RB2とRB5は入力と出力ポートに設定
TRISB2=0; //RB2/SDO:出力に設定
TRISB5=0; //RB5/SSn:出力に設定
TRISB4=0; //RB4/SCK:出力に設定
TRISB1=1; //RB1/SDI:入力に設定
RB5=1;
SSPEN=1; //SPIポートイネーブル
}
//SPI data 1バイト送信
void spi_out(unsigned char txdata)
{
unsigned char out_data;
out_data=0x00;
out_data=txdata;
SSPBUF=out_data; //送信バッファにデータ書き込み
DelayUs(64);
while(!SSPIF);
return;
}
unsigned char rom_read(unsigned char msb_add,unsigned char lsb_add)
{
unsigned char eeprom_rddata;
eeprom_rddata=0x00;
RB5=0; /* CS Active */
spi_out(0x03); /* Read command */
spi_out(msb_add); /* MSB ADDRESS */
spi_out(lsb_add); /* LSB ADDRESS */
spi_out(0x00); /* READ Data Clock */
while(!SSPIF);
eeprom_rddata=SSPBUF;
RB5=1; /* CS Idle */
return(eeprom_rddata);
}
void rom_write(unsigned char msb_add,unsigned char lsb_add,unsigned char data)
{
RB5=0; /* CS Active */
spi_out(0x02); /* Write command */
spi_out(msb_add); /* MSB ADDRESS */
spi_out(lsb_add); /* LSB ADDRESS */
spi_out(data); /* Write Data */
while(!SSPIF);
RB5=1; /* CS Idle */
}
void eeprom_write_on()
{
RB5=0; /* CS Active */
spi_out(0x06); /* Write EN ON command */
while(!SSPIF);
RB5=1; /* CS Idle */
}
void eeprom_write_off()
{
RB5=0; /* CS Active */
spi_out(0x04); /* Write EN OFF command */
while(!SSPIF);
RB5=1; /* CS Idle */
}
unsigned char eeprom_read_stat()
{
unsigned char eeprom_stat;
RB5=0; /* CS Active */
spi_out(0x05); /* STATUS read command */
spi_out(0x00); /* READ Data Clock */
while(!SSPIF);
RB5=1; /* CS Idle */
eeprom_stat=SSPBUF; /* Return STATUS data */
return(eeprom_stat);
}
こんな感じです。
今は先日書いていたテストプログラムを実装しています。
動き見ながら進めていきます。
今日はこの辺でタイムアップですかね。。。
みなさま・・・それではまた(^o^)/