Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
scrp_slave.hpp
00001 #ifndef SCRP_SLAVE_H 00002 #define SCRP_SLAVE_H 00003 #include "mbed.h" 00004 00005 /*USBでPCにつなぐポートと、基板上でRasPiとつなぐポートを同時に開く。 00006 *RedePinの有り無しの選択、ポートを一つだけ開くことも可。 00007 *bool interruptがデフォルトでtrueだが、falseを渡すことで割り込みを無効にできる。 00008 *その時は、受信のために繰り返しreceive()を呼び出す必要がある。 00009 *以下から選択。 00010 *ScrpSlave(PinName TX1,PinName RX1,uint32_t addr,bool interrupt = true);//RedePinなし、1ポート 00011 *ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート 00012 *ScrpSlave(PinName TX1,PinName RX1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinなし、2ポート 00013 *ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート+RedePinなし、1ポート 00014 *example not usb port 00015 *L432KC : TX = PA_9 , RX = PA_10 , REDE = PA_12 , addr = 0x0803f800 00016 *F446RE : TX = PC_12 , RX = PD_2 , RDDE = PH_1 , addr = 0x0807f800 00017 *H743ZI : TX = PD_5 , RX = PD_6 , REDE = PD_7 , addr = 0x081ee000 00018 *<obj>.addCMD(int cmd, bool (*proc)(int rx_data, int& tx_data)) 00019 *でcmdで指定したコマンドを受信したときに呼び出される 00020 *bool型で引数が(int rx_data, int& tx_data)の関数を指定する。 00021 *addrで指定されたフラッシュメモリーのアドレスに通信で使う1バイトのアドレスが保存される。 00022 *addrに0から254までの値を入れて、この値そのものをidとして通信で使うこともできる。 00023 *addrに255を入れると全受信モードになります。すべての受信idを自分のものとみなし応答します。 00024 *この機能はScrpSlaveの性質をよく理解したうえで使ってください。 00025 *通常のMD通信網に不注意にこれを入れると、送り返すresponseが衝突し、通信状態を悪化させます。 00026 * 00027 *このライブラリでは、シリアル送信、受信とも割り込みを利用しています。 00028 *Nucleoはシリアル通信割り込みを同時に2ポートまでしか利用できません。 00029 *このライブラリでシリアルポートを2ポート開いた場合、それ以外のシリアル通信で割り込みを利用できないので注意してください。 00030 * 00031 *シリアルポートに外部からアクセスして通信することもできるようになりました。 00032 *このライブラリでは同時に2個シリアルポートを開いていますが、それぞれport1,port2としてアクセスできます。 00033 *シリアルポートを1つだけ開いているときは、port1とport2,send1とsend2は同じモノ扱いになります。 00034 *sendのレスポンスはgetResponseがtrueの時に、receiveDataの返り値として知ることができます。 00035 *isWaitingで、今レスポンス待ち状態かどうか知ることができます。 00036 *レスポンス受信前に他の命令などを受信するとレスポンス待ちはキャンセルされます。 00037 *両方引数は0か1で、どちらのシリアルポートかを指定します。 00038 *レスポンスを受信した時に割り込みで呼ばれる関数を設定することができます。 00039 *void型。引数は(uint8_t id, uint8_t cmd, int16_t res)です。 00040 *attachResponseで関数を指定してください。 00041 * 00042 *クラス内のシリアルポートに.port1 .port2という形でアクセスできます。 00043 *printfしたいときなどは、 00044 *<obj>.port2.printf("hello\n"); 00045 *と書くことできます。 00046 *また、writeable(),putc()でデータを送信することができますが、LTC485使用時はREDEピンを別に制御する必要があります。 00047 *その他Serialクラスに存在する機能すべてにアクセスできますが、このライブラリで受信データをすべて処理しているので、 00048 *getc()などで個別に取り出すことはできません。 00049 *シリアルのボーレートは基本的に変更しないでください。 00050 *readable(),getc()は使わないでください。正常に動作しません。 00051 *また、受信・送信割り込みの設定は行わないでください。ライブラリが正常に動作しません。 00052 */ 00053 //ScrpSlave slave(SERIAL_TX,SERIAL_RX, 3); 3がそのままidとして使われる。 00054 //ScrpSlave slave(PC_12,PD_2 ,PH_1 ,SERIAL_TX,SERIAL_RX,0x0807f800); フラッシュメモリーの0x0807f800番地にidが保存される。 00055 //ScrpSlave slave(PA_9 ,PA_10,PA_12,SERIAL_TX,SERIAL_RX,0x0803f800); 00056 //ScrpSlave slave(PD_5 ,PD_6,PD_7,SERIAL_TX,SERIAL_RX,0x081ee000); 00057 //ScrpSlave slave(PC_12,PD_2 ,PH_1 ,SERIAL_TX,SERIAL_RX,0x0807f800,false);//rtos使用時や3ポート以上開き割り込みを無効にするとき。 00058 00059 00060 class ScrpSlave{ 00061 public: 00062 ScrpSlave(PinName TX1,PinName RX1,uint32_t addr,bool interrupt = true);//RedePinなし、1ポート 00063 ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート 00064 ScrpSlave(PinName TX1,PinName RX1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinなし、2ポート 00065 ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート+RedePinなし、1ポート 00066 ~ScrpSlave(); 00067 RawSerial port1; 00068 RawSerial port2; 00069 void addCMD(uint8_t cmd, bool (*proc)(int rx_data,int& tx_data)); 00070 void attachResponse(void (*func)(uint8_t id, uint8_t cmd, int16_t response));//レスポンス受信割り込み関数 00071 void receive();//割り込みを無効にしたときにこれを繰り返し呼び出して受信する。 00072 bool send1(uint8_t id, uint8_t cmd, int16_t tx_data, bool flag = true);//返り値 成功:true 失敗:false 00073 bool send2(uint8_t id, uint8_t cmd, int16_t tx_data, bool flag = true);//レスポンスを待つか、待たないかのflag 00074 bool isWaiting(uint8_t port);//send,send2の通信のレスポンス待ち状況確認。 00075 bool getResponse(uint8_t port);//レスポンスを受信したらtrueになる。 00076 int16_t receiveData(uint8_t port);//0か1か send1のレスポンスは0、send2のレスポンスは1を指定。データがない時は-1を返す。 00077 uint8_t receiveId();//直前の通信で送られてきたidを返す。 00078 uint8_t receiveCmd();//直前の通信で送られてきたCMD番号を返す。割り込み関数内でCMDを知りたいときに有効。 00079 uint8_t receivePort();//直前の通信で受信したポートを返す。 00080 private: 00081 DigitalOut *rede_; 00082 FlashIAP *flash_; 00083 RawSerial *serial_[2]; 00084 uint8_t send_data_[2][8]; 00085 uint8_t mode_; 00086 uint8_t my_id_; 00087 uint8_t rx_cmd_; 00088 uint8_t rx_id_; 00089 uint8_t receive_port_; 00090 uint32_t address_; 00091 bool all_receive_; 00092 bool interrupt_; 00093 bool wait_data_[2]; 00094 bool get_response_[2]; 00095 bool stx_flag_[2]; 00096 bool id_ok_[2]; 00097 uint8_t tmp_data_[2][5]; 00098 uint8_t data_count_[2]; 00099 int16_t rx_data_[2]; 00100 void (*responseFunc_)(uint8_t id, uint8_t cmd, int16_t response); 00101 bool (*procs_[256])(int rx_data, int& tx_data); 00102 bool sending(int, uint8_t, uint8_t, int16_t, bool = true); 00103 void sendNoInterrupt(uint8_t port); 00104 void changeID(uint8_t); 00105 void init(); 00106 void check(int port); 00107 void receive0(); 00108 void receive1(); 00109 void dataSend0(); 00110 void dataSend1(); 00111 void prime(int); 00112 }; 00113 00114 #endif /* SCRP_SLAVE_H */
Generated on Sat Oct 15 2022 07:52:33 by
1.7.2