my new gear...

Dependencies:   mbed

Committer:
yootee
Date:
Sun Mar 27 04:51:16 2022 +0000
Revision:
3:a9b4b2565a23
Child:
9:b5cb0607f484
Child:
13:31a44ed824b0
my new gear...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yootee 3:a9b4b2565a23 1 #ifndef SCRP_SLAVE_H
yootee 3:a9b4b2565a23 2 #define SCRP_SLAVE_H
yootee 3:a9b4b2565a23 3 #include "mbed.h"
yootee 3:a9b4b2565a23 4
yootee 3:a9b4b2565a23 5 /*USBでPCにつなぐポートと、基板上でRasPiとつなぐポートを同時に開く。
yootee 3:a9b4b2565a23 6 *RedePinの有り無しの選択、ポートを一つだけ開くことも可。
yootee 3:a9b4b2565a23 7 *bool interruptがデフォルトでtrueだが、falseを渡すことで割り込みを無効にできる。
yootee 3:a9b4b2565a23 8 *その時は、受信のために繰り返しreceive()を呼び出す必要がある。
yootee 3:a9b4b2565a23 9 *以下から選択。
yootee 3:a9b4b2565a23 10 *ScrpSlave(PinName TX1,PinName RX1,uint32_t addr,bool interrupt = true);//RedePinなし、1ポート
yootee 3:a9b4b2565a23 11 *ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート
yootee 3:a9b4b2565a23 12 *ScrpSlave(PinName TX1,PinName RX1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinなし、2ポート
yootee 3:a9b4b2565a23 13 *ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート+RedePinなし、1ポート
yootee 3:a9b4b2565a23 14 *example not usb port
yootee 3:a9b4b2565a23 15 *L432KC : TX = PA_9 , RX = PA_10 , REDE = PA_12 , addr = 0x0803f800
yootee 3:a9b4b2565a23 16 *F446RE : TX = PC_12 , RX = PD_2 , RDDE = PH_1 , addr = 0x0807f800
yootee 3:a9b4b2565a23 17 *H743ZI : TX = PD_5 , RX = PD_6 , REDE = PD_7 , addr = 0x081ee000
yootee 3:a9b4b2565a23 18 *<obj>.addCMD(int cmd, bool (*proc)(int rx_data, int& tx_data))
yootee 3:a9b4b2565a23 19 *でcmdで指定したコマンドを受信したときに呼び出される
yootee 3:a9b4b2565a23 20 *bool型で引数が(int rx_data, int& tx_data)の関数を指定する。
yootee 3:a9b4b2565a23 21 *addrで指定されたフラッシュメモリーのアドレスに通信で使う1バイトのアドレスが保存される。
yootee 3:a9b4b2565a23 22 *addrに0から254までの値を入れて、この値そのものをidとして通信で使うこともできる。
yootee 3:a9b4b2565a23 23 *addrに255を入れると全受信モードになります。すべての受信idを自分のものとみなし応答します。
yootee 3:a9b4b2565a23 24 *この機能はScrpSlaveの性質をよく理解したうえで使ってください。
yootee 3:a9b4b2565a23 25 *通常のMD通信網に不注意にこれを入れると、送り返すresponseが衝突し、通信状態を悪化させます。
yootee 3:a9b4b2565a23 26 *
yootee 3:a9b4b2565a23 27 *このライブラリでは、シリアル送信、受信とも割り込みを利用しています。
yootee 3:a9b4b2565a23 28 *Nucleoはシリアル通信割り込みを同時に2ポートまでしか利用できません。
yootee 3:a9b4b2565a23 29 *このライブラリでシリアルポートを2ポート開いた場合、それ以外のシリアル通信で割り込みを利用できないので注意してください。
yootee 3:a9b4b2565a23 30 *
yootee 3:a9b4b2565a23 31 *シリアルポートに外部からアクセスして通信することもできるようになりました。
yootee 3:a9b4b2565a23 32 *このライブラリでは同時に2個シリアルポートを開いていますが、それぞれport1,port2としてアクセスできます。
yootee 3:a9b4b2565a23 33 *シリアルポートを1つだけ開いているときは、port1とport2,send1とsend2は同じモノ扱いになります。
yootee 3:a9b4b2565a23 34 *sendのレスポンスはgetResponseがtrueの時に、receiveDataの返り値として知ることができます。
yootee 3:a9b4b2565a23 35 *isWaitingで、今レスポンス待ち状態かどうか知ることができます。
yootee 3:a9b4b2565a23 36 *レスポンス受信前に他の命令などを受信するとレスポンス待ちはキャンセルされます。
yootee 3:a9b4b2565a23 37 *両方引数は0か1で、どちらのシリアルポートかを指定します。
yootee 3:a9b4b2565a23 38 *レスポンスを受信した時に割り込みで呼ばれる関数を設定することができます。
yootee 3:a9b4b2565a23 39 *void型。引数は(uint8_t id, uint8_t cmd, int16_t res)です。
yootee 3:a9b4b2565a23 40 *attachResponseで関数を指定してください。
yootee 3:a9b4b2565a23 41 *
yootee 3:a9b4b2565a23 42 *クラス内のシリアルポートに.port1 .port2という形でアクセスできます。
yootee 3:a9b4b2565a23 43 *printfしたいときなどは、
yootee 3:a9b4b2565a23 44 *<obj>.port2.printf("hello\n");
yootee 3:a9b4b2565a23 45 *と書くことできます。
yootee 3:a9b4b2565a23 46 *また、writeable(),putc()でデータを送信することができますが、LTC485使用時はREDEピンを別に制御する必要があります。
yootee 3:a9b4b2565a23 47 *その他Serialクラスに存在する機能すべてにアクセスできますが、このライブラリで受信データをすべて処理しているので、
yootee 3:a9b4b2565a23 48 *getc()などで個別に取り出すことはできません。
yootee 3:a9b4b2565a23 49 *シリアルのボーレートは基本的に変更しないでください。
yootee 3:a9b4b2565a23 50 *readable(),getc()は使わないでください。正常に動作しません。
yootee 3:a9b4b2565a23 51 *また、受信・送信割り込みの設定は行わないでください。ライブラリが正常に動作しません。
yootee 3:a9b4b2565a23 52 */
yootee 3:a9b4b2565a23 53 //ScrpSlave slave(SERIAL_TX,SERIAL_RX, 3); 3がそのままidとして使われる。
yootee 3:a9b4b2565a23 54 //ScrpSlave slave(PC_12,PD_2 ,PH_1 ,SERIAL_TX,SERIAL_RX,0x0807f800); フラッシュメモリーの0x0807f800番地にidが保存される。
yootee 3:a9b4b2565a23 55 //ScrpSlave slave(PA_9 ,PA_10,PA_12,SERIAL_TX,SERIAL_RX,0x0803f800);
yootee 3:a9b4b2565a23 56 //ScrpSlave slave(PD_5 ,PD_6,PD_7,SERIAL_TX,SERIAL_RX,0x081ee000);
yootee 3:a9b4b2565a23 57 //ScrpSlave slave(PC_12,PD_2 ,PH_1 ,SERIAL_TX,SERIAL_RX,0x0807f800,false);//rtos使用時や3ポート以上開き割り込みを無効にするとき。
yootee 3:a9b4b2565a23 58
yootee 3:a9b4b2565a23 59
yootee 3:a9b4b2565a23 60 inline int constrain(int x,int a,int b){
yootee 3:a9b4b2565a23 61 return (x < a ? a : x > b ? b : x);
yootee 3:a9b4b2565a23 62 }
yootee 3:a9b4b2565a23 63
yootee 3:a9b4b2565a23 64 inline double constrain(double x,double a,double b){
yootee 3:a9b4b2565a23 65 return (x < a ? a : x > b ? b : x);
yootee 3:a9b4b2565a23 66 }
yootee 3:a9b4b2565a23 67
yootee 3:a9b4b2565a23 68 class ScrpSlave{
yootee 3:a9b4b2565a23 69 public:
yootee 3:a9b4b2565a23 70 ScrpSlave(PinName TX1,PinName RX1,uint32_t addr,bool interrupt = true);//RedePinなし、1ポート
yootee 3:a9b4b2565a23 71 ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート
yootee 3:a9b4b2565a23 72 ScrpSlave(PinName TX1,PinName RX1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinなし、2ポート
yootee 3:a9b4b2565a23 73 ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート+RedePinなし、1ポート
yootee 3:a9b4b2565a23 74 ~ScrpSlave();
yootee 3:a9b4b2565a23 75 RawSerial port1;
yootee 3:a9b4b2565a23 76 RawSerial port2;
yootee 3:a9b4b2565a23 77 void addCMD(uint8_t cmd, bool (*proc)(int rx_data,int& tx_data));
yootee 3:a9b4b2565a23 78 void attachResponse(void (*func)(uint8_t id, uint8_t cmd, int16_t response));//レスポンス受信割り込み関数
yootee 3:a9b4b2565a23 79 void receive();//割り込みを無効にしたときにこれを繰り返し呼び出して受信する。
yootee 3:a9b4b2565a23 80 bool send1(uint8_t id, uint8_t cmd, int16_t tx_data, bool flag = true);//返り値 成功:true 失敗:false
yootee 3:a9b4b2565a23 81 bool send2(uint8_t id, uint8_t cmd, int16_t tx_data, bool flag = true);//レスポンスを待つか、待たないかのflag
yootee 3:a9b4b2565a23 82 bool isWaiting(uint8_t port);//send,send2の通信のレスポンス待ち状況確認。
yootee 3:a9b4b2565a23 83 bool getResponse(uint8_t port);//レスポンスを受信したらtrueになる。
yootee 3:a9b4b2565a23 84 int16_t receiveData(uint8_t port);//0か1か send1のレスポンスは0、send2のレスポンスは1を指定。データがない時は-1を返す。
yootee 3:a9b4b2565a23 85 uint8_t receiveId();//直前の通信で送られてきたidを返す。
yootee 3:a9b4b2565a23 86 uint8_t receiveCmd();//直前の通信で送られてきたCMD番号を返す。割り込み関数内でCMDを知りたいときに有効。
yootee 3:a9b4b2565a23 87 uint8_t receivePort();//直前の通信で受信したポートを返す。
yootee 3:a9b4b2565a23 88 private:
yootee 3:a9b4b2565a23 89 DigitalOut *rede_;
yootee 3:a9b4b2565a23 90 FlashIAP *flash_;
yootee 3:a9b4b2565a23 91 RawSerial *serial_[2];
yootee 3:a9b4b2565a23 92 uint8_t send_data_[2][8];
yootee 3:a9b4b2565a23 93 uint8_t mode_;
yootee 3:a9b4b2565a23 94 uint8_t my_id_;
yootee 3:a9b4b2565a23 95 uint8_t rx_cmd_;
yootee 3:a9b4b2565a23 96 uint8_t rx_id_;
yootee 3:a9b4b2565a23 97 uint8_t receive_port_;
yootee 3:a9b4b2565a23 98 uint32_t address_;
yootee 3:a9b4b2565a23 99 bool all_receive_;
yootee 3:a9b4b2565a23 100 bool interrupt_;
yootee 3:a9b4b2565a23 101 bool wait_data_[2];
yootee 3:a9b4b2565a23 102 bool get_response_[2];
yootee 3:a9b4b2565a23 103 bool stx_flag_[2];
yootee 3:a9b4b2565a23 104 bool id_ok_[2];
yootee 3:a9b4b2565a23 105 uint8_t tmp_data_[2][5];
yootee 3:a9b4b2565a23 106 uint8_t data_count_[2];
yootee 3:a9b4b2565a23 107 int16_t rx_data_[2];
yootee 3:a9b4b2565a23 108 void (*responseFunc_)(uint8_t id, uint8_t cmd, int16_t response);
yootee 3:a9b4b2565a23 109 bool (*procs_[256])(int rx_data, int& tx_data);
yootee 3:a9b4b2565a23 110 bool sending(int, uint8_t, uint8_t, int16_t, bool = true);
yootee 3:a9b4b2565a23 111 void sendNoInterrupt(uint8_t port);
yootee 3:a9b4b2565a23 112 void changeID(uint8_t);
yootee 3:a9b4b2565a23 113 void init();
yootee 3:a9b4b2565a23 114 void check(int port);
yootee 3:a9b4b2565a23 115 void receive0();
yootee 3:a9b4b2565a23 116 void receive1();
yootee 3:a9b4b2565a23 117 void dataSend0();
yootee 3:a9b4b2565a23 118 void dataSend1();
yootee 3:a9b4b2565a23 119 void prime(int);
yootee 3:a9b4b2565a23 120 };
yootee 3:a9b4b2565a23 121
yootee 3:a9b4b2565a23 122 #endif /* SCRP_SLAVE_H */