はじめまして。プログラミング初心者です。ご存じの方いらっしゃいましたら答えていただけると幸せます。
クロック同期式モードを使用してEEPROMと通信を行いたいです。(EEPROMはM95M01Dを使用しております。)
割込みを使わずに、一度EEPROMのステータスを読み、値を返す関数を作成しました。
下記のように書きました。別の通信ポートを使用してこの関数を呼び、画面出力しております。
EEPROMのデータシートより、ステータスレジスタ、b6 , b5 , b4 は必ず"0"が読めます。
オシロスコープで信号を確認すると、EEPROMの出力ポート、マイコンのRxD(PB6)のピンは"0"が16クロック分出力されていましたが、返り値は255となってしまいます。
送受信時のクロックは出力されており、TxD(PB5)からはEEPROMへのステータスレジスタリードの命令信号(0x05)が正しく出ているようです。
また、別のREAD命令やWRITE許可命令を送信すると、送信ポートから信号は出ており、クロックも必要数出力があるのですが、EEPROMからマイコンへの出力信号はHighに固定されたままになってしまいます。
変な風に日本語変換されてしまっていたのでこちらに書きます。わかりにくくて申し訳ありません。
やり方がわからず、、調べてからもう一度書きます。取り急ぎコピペしました
//--- set PORTB ---// PORTB.DDR.BIT.B3 = 1; //Chip Select PORTB.DDR.BIT.B5 = 1; //TXD PORTB.DDR.BIT.B6 = 0; //RXD PORTB.DDR.BIT.B7 = 1; //clock out to EEP-ROM PORTB.ICR.BIT.B6 = 1; //input bufferPORTB.DR.BIT.B3 = 1; //Chip Select High = not active
IOPORT.PFFSCI.BYTE = 0; //select control mode
//--- set SCI2 ---////EEPROM SCI2.SCR.BYTE = 0x00 ; //初期値 SCI2.SMR.BYTE = 0x82 ; //クロック同期式モード SCI2.SCMR.BIT.SDIR = 1; //MSB First SCI2.BRR = 55 ; // bps //SCI2.SCR.BYTE = 0x00 ; //送受信関数内でstart
short readStatusData(void) { unsigned char readData=0; unsigned char receiveData; unsigned char dummyData;
while( !SCI2.SSR.BIT.TEND ){}; //wait until busy
receiveData = SSCI2.SSR.BIT.ORER; SCI2.SSR.BIT.ORER = 0; // SCI2.SCR.BYTE = 0xa1;PORTB.DR.BIT.B3 = 0; // CS = Low active SCI2.TDR = 0x05; //EEPROM Read Code while(! SCI2.SSR.BIT.TEND) {} //wait until send end SCI2.SCR.BYTE = 0x00;
SCI2.SCR.BYTE = 0x50; //start receive data dummyData =SCI2.RDR; while(! SCI2.SSR.BIT.TEND) {} //wait until send end readData = (unsigned char)SCI2.RDR; while(! SCI2.SSR.BIT.TEND) {} //wait until send end
PORTB.DR.BIT.B3 = 1 ; //CS = High ; DisableSCI2.SCR.BYTE = 0x00;
return(readData);}