MCP3204をSTM303K8T6で同時に6個使ってみた

Dependencies:   mbed 24LC1025 MCP3204

Revision:
3:99c659d89698
Parent:
2:133b3bf22850
Child:
4:56d1f3a81b30
--- a/main.cpp	Wed Aug 05 06:44:23 2020 +0000
+++ b/main.cpp	Wed Sep 09 08:07:13 2020 +0000
@@ -1,8 +1,9 @@
 #include "mbed.h"
 #include "MCP3204.h"
+#include "24LC1025.h"
 
 Serial pc(PA_2, PA_3, 115200); //pin19,20 TX,RX
-CAN can(PA_11, PA_12,100000); //pin21,22 rd,td
+CAN can(PA_11, PA_12); //pin21,22 rd,td
 SPI spi(PA_7, PA_6, PA_5);
 MCP3204 mcp1(spi,PB_0); //下z-
 MCP3204 mcp2(spi,PB_1); //右x+
@@ -10,21 +11,36 @@
 MCP3204 mcp4(spi,PA_8); // 前y+
 MCP3204 mcp5(spi,PA_10); //上z+
 MCP3204 mcp6(spi,PF_0); //後y-
+LC1025 eeprom = LC1025(PB_7, PB_6);
+DigitalOut led(PB_5);
+
 
 CANMessage msg;
 
 #define T 0.03
 
+float cal_x=0,cal_y=0,cal_z=0;
+int i,j,cnt=0,page_frg=0;
+float world_time;
+uint16_t eeprom_cnt = 0x0000;
+char serialData[4];
+
 union Float2Byte{
     float _float;
     char _byte[4];
 };
 typedef union Float2Byte Float2Byte;
 
+union Int2Byte{
+    unsigned short _int;
+    char _byte[2];
+};
+typedef union Int2Byte Int2Byte;
+
+
 void send(float senddata,int id){
     //pc.printf("Master send()\n\r");
     
-    /*ID: 0x01*/
     Float2Byte sendFloat;
     sendFloat._float = senddata;
     //ここに送りたい値を入れる.
@@ -40,18 +56,100 @@
     } 
 }
 
+void send2(unsigned short senddata1,unsigned short senddata2,unsigned short senddata3,int id){
+    //pc.printf("Master send()\n\r");
+    
+    /*ID: 0x01*/
+    Int2Byte sendInt;
+    sendInt._int = senddata1;
+    //ここに送りたい値を入れる.
+    
+    char serialData[6];
+    
+    serialData[0] = sendInt._byte[0];
+    serialData[1] = sendInt._byte[1];
+        //pc.printf("send_char: %d\n\r", serialData[i]);
+    sendInt._int = senddata2;
+    serialData[2] = sendInt._byte[0];
+    serialData[3] = sendInt._byte[1];
+
+    sendInt._int = senddata3;
+    serialData[4] = sendInt._byte[0];
+    serialData[5] = sendInt._byte[1];
+    //pc.printf("sendFloat: %f\n\r", sendFloat._float);
+    if(can.write(CANMessage(id, serialData, 6))){
+        //pc.printf("Send.\n\r");
+    } 
+}
+
 void receive(){
     Float2Byte getFloat;
+    Int2Byte getInt;
+    led = 0;
     
     if(can.read(msg)){
-        /*ID: 0x01*/
+        //ID: 0x01
         if(msg.id == 0x01){
             //pc.printf("ID: 0x01\n\r");
             for(int i=0;i<4;++i){
                 getFloat._byte[i] = msg.data[i];
                 //pc.printf("get_char: %d\n\r", getFloat._byte[i]);
             }
-            pc.printf("world_time:%.2f\r\n", getFloat._float);
+            world_time = getFloat._float;
+            pc.printf("world_time:%.2f\r\n", world_time);
+        }
+        
+        if(msg.id == 0x02){
+            //pc.printf("ID: 0x02\n\r");
+            getInt._byte[0] = msg.data[0];
+            getInt._byte[1] = msg.data[1];
+            cal_x=(float)getInt._int /10.0f;
+            pc.printf("Mag:%.2f", cal_x);
+            
+            getInt._byte[0] = msg.data[2];
+            getInt._byte[1] = msg.data[3];
+            cal_y=(float)getInt._int /10.0f;
+            pc.printf(",%.2f", cal_y);
+            
+            getInt._byte[0] = msg.data[4];
+            getInt._byte[1] = msg.data[5];
+            cal_z=(float)getInt._int /10.0f;
+            pc.printf(",%.2f\r\n", cal_z);
+            
+            if(page_frg == 0){
+                *(float*)serialData=0.0f;
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4);
+                *(float*)serialData=cal_x;
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4);
+                *(float*)serialData=cal_y;
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4);
+                *(float*)serialData=cal_z;
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4);
+                *(float*)serialData=world_time;
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4);
+                *(float*)serialData=0.0f;
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4);
+                //pc.printf("%d,0x%x\r\n",page_frg,eeprom_cnt);
+            }else if(page_frg == 1){
+                *(float*)serialData=0.0f;
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4);
+                *(float*)serialData=cal_x;
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4);
+                *(float*)serialData=cal_y;
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4);
+                *(float*)serialData=cal_z;
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4);
+                *(float*)serialData=world_time;
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4);
+                *(float*)serialData=0.0f;
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4);
+                //pc.printf("%d,0x%x\r\n",page_frg,eeprom_cnt);
+            }else{
+                //pc.printf("EEPROM_ERROR!! You should erase memory\r\n");
+            }
+            eeprom_cnt = 0x18 + eeprom_cnt;
+            
+            
         }
         
         if(msg.id == 0x03){
@@ -62,17 +160,27 @@
             }
             pc.printf("ID0x03:%.2f\r\n", getFloat._float);
         }
+        
+        if(msg.id == 0x04){
+            //pc.printf("ID: 0x01\n\r");
+            for(int i=0;i<4;++i){
+                getFloat._byte[i] = msg.data[i];
+                //pc.printf("get_char: %d\n\r", getFloat._byte[i]);
+            }
+            pc.printf("ID0x04:%.2f\r\n", getFloat._float);
+        }
     }
+    led=1;
     
 }
 
 int main(){
     int adc1[4],adc2[4],adc3[4],adc4[4],adc5[4],adc6[4];
-    int i,j,cnt;
     float ave[6],buff;
     
     can.attach(receive, CAN::RxIrq);
-    pc.printf("Hello world\r\n");
+    pc.printf("Hello world%d\r\n",sizeof(i));
+    led = 1;
     wait(1.0);
     
     while(1){
@@ -217,29 +325,52 @@
         */
         
         cnt = 0;
-             if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:0\r\n");
-        //else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] < ave[0])pc.printf("x:90,y:0,z:0\r\n");
-        else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] > ave[0])pc.printf("x:180,y:0,z:0\r\n");
-        //else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:270,y:0,z:0\r\n");
-
-        else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:0\r\n");
-        //else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:90\r\n");
-        else if(ave[1] > ave[2] && ave[3] < ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:180\r\n");
-        //else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:270\r\n");
         
-        else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:0\r\n");
-        //else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:0,y:90,z:0\r\n");
-        else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:0,y:180,z:0\r\n");
-        //else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:0,y:270,z:0\r\n");
-        
-        else pc.printf("none\r\n");
+        if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0]){
+            send2((unsigned short)(0.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(0.0f+cal_z),6);
+            //else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] < ave[0])pc.printf("x:90,y:0,z:0\r\n");
+        }else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] > ave[0]){
+            send2((unsigned short)(180.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(0.0f+cal_z),6);
+            //else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:270,y:0,z:0\r\n");
+        }else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0]){
+            send2((unsigned short)(0.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(0.0f+cal_z),6);
+            //else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:90\r\n");
+        }else if(ave[1] > ave[2] && ave[3] < ave[5] && ave[4] < ave[0]){
+            send2((unsigned short)(0.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(180.0f+cal_z),6);
+            //else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:270\r\n");
+        }else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0]){
+            send2((unsigned short)(0.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(0.0f+cal_z),6);
+            //else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:0,y:90,z:0\r\n");
+        }else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] > ave[0]){
+            send2((unsigned short)(0.0f+cal_x),(unsigned short)(180.0f+cal_y),(unsigned short)(0.0f+cal_z),6);
+            //else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:0,y:270,z:0\r\n");
+        }else{
+             pc.printf("none\r\n");
+        }
+        pc.printf("%d,%x,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f\r\n",page_frg,eeprom_cnt,ave[1],ave[2],ave[3],ave[5],ave[4],ave[0]);
         
+        for(i=0; i<6; i++){
+            *(float*)serialData = ave[i];
+            //pc.printf("%f,",ave[i]);
+            if(eeprom_cnt > 0xFFF0){
+                page_frg++;
+                eeprom_cnt = 0;
+            }
             
-        
-        pc.printf("%.1f,%.1f,%.1f,%.1f,%.1f,%.1f\r\n",ave[1],ave[2],ave[3],ave[5],ave[4],ave[0]);
-        
-        
-        wait(0.5);
+            if(page_frg == 0){
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4);
+                //pc.printf("%d,0x%x\r\n",page_frg,eeprom_cnt);
+            }else if(page_frg == 1){
+                eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4);
+                //pc.printf("%d,0x%x\r\n",page_frg,eeprom_cnt);
+            }else{
+                //pc.printf("EEPROM_ERROR!! You should erase memory\r\n");
+            }
+            eeprom_cnt = 0x04 + eeprom_cnt;
+            wait(0.01);
+            
+        }
+        wait(0.1);
     }
     
 }