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

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

PIC16F88を動かす。。。その57(SPI:その18 まとめ)

2012-11-30 05:17:17 | PIC16F88

おはようございます。

としぶぅ~です。

 

今日も寒いですね。。。最近夜が遅いのでまた胃の調子が悪くなってきました。。。

夜の食事の量減らさないと…・かな^^;

 

そうそう。。。このブログ始めて”105日”経過しました。

ま、週に1回くらい休みましたが。。。ほぼ毎日更新してました。

本日ふと訪問数みてびっくり!

トータル閲覧数(PV):18738

トータル訪問者数(IP):10123

訪問者数で10000人超えました!

おぉぉ。。。見に来ていただいているみなさまありがとうございます。

だいたい1日100人くらいの人がこのブログ見に来てもらっている。。。。。ということでしょうか!

これからもがんばって更新していくので見に来てくださいね^^

 

さて本日は、

昨日でだいたいSPIについては確認できた?と思っていますので本日はとりあえず簡単にまとめて・・・・

とりあえず大事なことを箇条書きにしておこうかなとおもいます。

1.SPI通信=4線式通信

2.使用するレジスタはSSPBUF・SSPSTAT・SSPCON

3.ボーレートは、OSC/4、OSC/16、OSC/64の3種類から選択。SSPMにて設定

4.SSPBUFにデータを書き込むとSDOピンからデータが自動的に出力される。

5.リード/ライトアクセス中は、CSを途切れさせてはいけない

6.クロック・データの関係は、CKP・CKE・SMPによって設定する。

7.マスターモードでデータをリクエストする場合、データ部分にダミーデータを書き込まないとクロックが出ないので受信できない

8.SPIのI/Fデバイスを使用する場合は、そのデバイスの仕様にあったコマンドにてアクセスをする。

9.CSについては、ボーレート x 8bitで時間を計算して、SSPBUFにデータを書き込む前に”L”、書き込んでから計算値分

  時間経過してから”H”にする必要がある。

10.マスター・スレーブ同じ設定にしないと通信はできない。

11.クロック供給式(同期式)なので外付けクロックは必要ない。

 

こんなところでしょうか・・・・

結構つまづきましたがなんとかSPI通信の確認ができました。

SPIのI/Fをもったデバイスは結構ある。。。。特にセンサ関係。

SPIは結構ボーレートが上げれるので有効かも?I2CのI/Fだと400Kbpsか1Mbps・・・・

さて次はI2Cやってみようと思います。

 

まだまだやることはいっぱいありますね。。。。

がんばります^^

 

今日はこの辺にしておきます。

それではみなさま。。。良い一日を(^o^)/

 

 

 

 


PIC16F88を動かす。。。その56(SPI:その17)

2012-11-29 05:56:57 | PIC16F88

おはようございます。

としぶぅ~です。

 

今日も寒いですね。。。。。

風邪ひかないようにせねば。。。。

 

さて本日は、昨日ひっかかっていたSPI-I/FのEEPROMの読み書きがうまくいかない・・・

ですが、データシートとにらめっこしたら・・・・ありました。。。制限!

上記は使用中のEEPROM:25AA320Aのデータシートから抜粋しました。

TWCという書き込んでから次のサイクルに移るまでの時間。。。が5ms/maxで規制されています。。。

5msも待たないと!?

つかえるんかな・・・・・^^;

ま、とりあえず書き込みタイミングを、

  AD

   ↓

EEPROMに書き込む

   ↓

4mswait

   ↓   

EEPROM読み込み

   ↓

 LCD表示

というふうにして書き込んでから読み込むまでにある程度時間を稼ぐようにしてみました。

(ch1:/CS,ch2:SDI,ch3:SDO,ch4:CLK)

波形的にはこんな感じです。

問題なくデータ読めています。

後、アドレスもずらしています。

(ch1:/CS,ch2:SDI,ch3:SDO,ch4:CLK)

上記は読み込みサイクルだけですがアドレスも変化していることがわかります。

一応問題なく動作するようになりました。

 

よかった!

動作状況は下記参照

とりあえず・・・

 

なんとかSPIの動作確認で目的としていたところまでは到達しました。

明日は、ちょっとまとめて次はI2Cに移ろうかな。

つまづきながらもとりあえず順調に進んでおります。

 

今日はここでタイムアップです。

 

さてみなさま、今日も良い一日を(^o^)/

 

 

 

 

 


PIC16F88を動かす。。。その55(SPI:その16)

2012-11-28 06:14:32 | PIC16F88

おはようございます。

としぶぅ~です。

 

今日からまた冷え込んでくるようですね。。。。風邪ひかないようにせねば。。

 

本日は、昨日から取り組んでいる確認プログラムの実装!

動作確認しながら進めていますが。。。。はやくもはまっております。^^;

とりあえず、プログラムの頭で決め打ちでデータを書き込むと普通に読み出せるのだが。。。。

ADした後、書き込んで読み出すとデータが読み出せない?・・・・というより書き込めていない^^;

うむ。。。いろいろやってみましたが今のところダメです。。。。

これは、デバッグ中のPC画面・・・・

プログラムの頭で一度書き込んで、AD値が変化した時にデータを読み込んでいるところ・・・・読み込んだところで止めています。

これならうまく書き込み、読み込みができている。。。。。

ちょっとデータシートもう少し突っ込んで読まないとだめかな。。。。なんか制約があるかもしれない。。。。

一応上記条件の場合は、表示できる・・・・頭で25hを書き込んでいるので・・・・読み込みデータも25hと表示できているので

OK!

 

ここは簡単に通過!のつもりだったんだけどな。。。

 

今日はここでタイムアップです。

明日ももう少し頑張ってみます。

 

それではみなさま。。。。良い一日を~(^o^)/

 

 

 

 


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

 

 


PIC16F88を動かす。。。その53(SPI:その14)

2012-11-26 06:10:43 | PIC16F88

おはようございます。

としぶぅ~です。

 

今日は、SPIのステータスを見るためのモジュールを作ってみましたが。。。

なんかうまく動かない^^;

しばらくはこの状態がつづく??

先週書き込みして読み出せていたのにそれもうまくいかない・・・・う~む・・・どうしたことか・・・

明日また、プログラム見直します。

どうもぐるぐる回しておくのはいまいちかな。。。。スイッチつけて、スイッチが押されたときにライト・リード

できるようにしないとデバッグが進まないかも・・・・

そっちのハードの変更もかんがえなければ・・・・・

デバッグ方法なかなか難しいです。

 

さて本日はタイムアップです。

しばらくはこの状態・・・・つまらない状態がつづくかな。。。。

ちょっと違う話題を書くかも。。。

 

それではみなさま本日も良い一日を!!

(^o^)/