としぶぅ~の「工作部屋」...毎日少しのお勉強

趣味・関心事を書いていこうと思います。

PIC16F88を動かす。。。その54(SPI:その15)

2012-11-27 05:55:41 | PIC16F88

おはようございます。

としぶぅ~です。

 

昨日は雨すごかったですね。。。。会社行くのにびしょびしょになっちゃいました^^;

 

本日は昨日のつづき・・・

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^)/

 

 



最新の画像もっと見る