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.
Dependencies: DataControl
Revision 0:b9571508f055, committed 2022-08-23
- Comitter:
- ikarashikota
- Date:
- Tue Aug 23 16:59:47 2022 +0000
- Child:
- 1:6abb511f8c4c
- Commit message:
- :-)
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DataControl.lib Tue Aug 23 16:59:47 2022 +0000 @@ -0,0 +1,1 @@ +DataControl#65149aeacbcc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ikarashiCAN.cpp Tue Aug 23 16:59:47 2022 +0000
@@ -0,0 +1,115 @@
+
+#include "ikarashiCAN.h"
+
+ikarashiCAN::ikarashiCAN(PinName rd, PinName td, int msgID, int frequency):
+ can(rd, td, frequency), msg(msgID, reciever, 4)
+{
+ _msgID = msgID;
+ sended_msgID = 0;
+ can_s = 0;
+ can_r = 0;
+ _can_data = 0;
+}
+
+ikarashiCAN::ikarashiCAN(PinName rd, PinName td, int msgID):
+ can(rd, td, 50000), msg(msgID, reciever, 4)
+{
+ _msgID = msgID;
+ sended_msgID = 0;
+ can_s = 0;
+ can_r = 0;
+ _can_data = 0;
+}
+
+//----------------------bit controll------------------------
+int ikarashiCAN::getData()
+{
+ return dataCombine(msg.data, msg.len);
+}
+//--------------------------------------------------------//
+
+
+
+//---attach function---------------------------------------//
+void ikarashiCAN::send()
+{
+ if(can.write(CANMessage(_msgID, sender, separated_data_size))) {
+ can_s = 1;
+ } else {
+ can_s = 0;
+ }
+}
+
+void ikarashiCAN::recieve()
+{
+ if(can.read(msg)) {
+ can_r = 1;
+ }else{
+ can_r = 0;
+ }
+}
+//--------------------------------------------------------//
+
+
+
+//---attach-----------------------------------------------//
+void ikarashiCAN::startSend(float second)
+{
+ can_ticker.attach(this, &ikarashiCAN::send, second);
+}
+
+void ikarashiCAN::startRecieve()
+{
+ can_ticker.attach(this, &ikarashiCAN::recieve, CAN::TxIrq);
+}
+//--------------------------------------------------------//
+
+
+int ikarashiCAN::simpleGetData(int _id){
+ if(_id == msg.id && can_r){
+ _can_data = getData();
+ return getData();
+ }else{
+ return _can_data;
+ }
+}
+
+
+bool ikarashiCAN::checkSender()
+{
+ return can_s;
+}
+
+bool ikarashiCAN::checkReciever()
+{
+ return can_r;
+}
+
+int ikarashiCAN::recievedCanID(){
+ if(can_r){
+ return msg.id;
+ }else{
+ return -1;
+ }
+}
+
+int ikarashiCAN::myCanID(){
+ return _msgID;
+}
+
+int ikarashiCAN::CanLen(){
+ return msg.len;
+}
+
+void ikarashiCAN::sender_reset()
+{
+ for(int i=0; i<4; i++) sender[i] = 0;
+}
+
+void ikarashiCAN::reciever_reset()
+{
+ for(int i=0; i<4; i++) reciever[i] = 0;
+}
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ikarashiCAN.h Tue Aug 23 16:59:47 2022 +0000
@@ -0,0 +1,168 @@
+/** @author 五十嵐幸多
+ *
+ * 割と簡単にCAN通信ができるクラスです。
+ * 通信初心者なので何かあったら、すぐ五十嵐へGO
+ */
+#ifndef IKARASHI_CAN
+
+#define IKARASHI_CAN
+
+#include "mbed.h"
+#include "DataControl.h"
+
+/*サンプルコード
+2台のCANを使って通信するヤツです。
+
+#include "mbed.h"
+#include "ikarashiCAN.h"
+
+Serial pc(USBTX,USBRX,115200);
+
+InterruptIn button(USER_BUTTON);
+DigitalOut led(LED2);
+Ticker ticker;
+
+//ikarashiCAN ican1(D15, D14, 1, 50000); //sender
+ikarashiCAN ican1(D15, D14, 1); //sender
+ikarashiCAN ican2(D4, D10, 2, 50000); //reciever
+
+uint16_t data = 0;
+
+void pushed(){
+ ican1.setData(999999);
+}
+void add(){
+
+ led != led;
+
+ data++;
+ ican1.setData(data);
+}
+
+int main()
+{
+
+ ticker.attach(&add, 1);
+ ican1.startSend(0.1);
+ ican2.startRecieve();
+ led = 1;
+ button.mode(PullDown);
+
+ while(1){
+ button.fall(&pushed);
+ pc.printf("sdata: %d rdata: %d len: %d s: %d r: %d\n\r", data,ican2.simpleGetData(1), ican2.CanLen(), ican1.checkSender(), ican2.checkReciever());
+ }
+
+}
+
+*/
+
+
+/// CAN通信のクラスです
+class ikarashiCAN : public DataControl
+{
+public:
+
+ /** コンストラクタ
+ *
+ * @param rd CANのrdピン
+ * @param td CANのtdピン
+ * @param msgID CANのID
+ * @param frequency CANの周波数
+ * @note nucleoでやる場合、frequencyは50000にしないとなぜか安定しません。
+ * なので、frequencyを設定しなかったとき自動的に周波数が50000に設定されるようにしました。
+ * もっといい方法があるかも...
+ */
+ ikarashiCAN(PinName rd, PinName td, int msgID, int frequency);
+ ikarashiCAN(PinName rd, PinName td, int msgID);
+
+ /** 送信するデータをセットする関数
+ *
+ * 一度送信するデータをセットします。
+ * @typedef T 無の型です。一旦値を保持するための型
+ * @param _data 一旦値を保持する変数
+ */
+ template <class T>
+ void setData(T _data){
+ dataSet(_data, sender);
+ }
+
+ /** データを受け取る関数
+ *
+ * 受信したデータを返します。
+ * @return int 受信したデータ
+ */
+ int getData();
+
+ /** お手軽関数
+ *
+ * ほんとは色々処理を実行してからデータを取得しなきゃなんですけど、めんどくさいですよね!
+ * なので、簡単に受信したデータを取得できる関数を用意しました。
+ * 特定のIDのデータを取得できます。
+ * @param _id 受信したいCANのID
+ * @return int 受信したデータ
+ */
+ int simpleGetData(int _id);
+
+ ///セットしたデータを送信します。
+ void send();
+
+ ///データを受信します。データの取得とは違います。
+ void recieve();
+
+ /** attach関数
+ *
+ * send関数のattachバージョン。
+ * @param second 繰り返す間隔。単位は[s]
+ */
+ void startSend(float second);
+
+ /** attach関数
+ *
+ * recieve関数のattachバージョン。データが送信されたときに自動で受信します。
+ */
+ void startRecieve();
+
+ ///データの送信が成功したときにtrueになります。
+ bool checkSender();
+
+ ///データの受信に成功したときにtrueになります。
+ bool checkReciever();
+
+ ///受信したデータのIDを返します。取得に失敗したときは-1を返します。
+ int recievedCanID();
+
+ ///このクラスを適用しているCANのIDを返します。
+ int myCanID();
+
+ ///受信したデータのサイズ(byte)を返します。
+ int CanLen();
+
+
+ void sender_reset();
+ void reciever_reset();
+
+
+private:
+
+ CAN can;
+ CANMessage msg;
+ int _msgID;
+ int sended_msgID;
+
+ Ticker can_ticker;
+
+ ///送信するデータの配列
+ char sender[4];
+
+ ///受信したデータが格納される配列
+ char reciever[4];
+
+ int _can_data;
+ bool can_s;
+ bool can_r;
+
+};
+
+#endif
+