master_hk

Dependencies:   mbed-rtos mbed

Committer:
sakthipriya
Date:
Mon Dec 15 11:32:41 2014 +0000
Revision:
0:67b7e9f8d9b0
master_hk

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sakthipriya 0:67b7e9f8d9b0 1 #include "mbed.h"
sakthipriya 0:67b7e9f8d9b0 2 #include "rtos.h"
sakthipriya 0:67b7e9f8d9b0 3
sakthipriya 0:67b7e9f8d9b0 4 const int addr = 0x20; //slave address
sakthipriya 0:67b7e9f8d9b0 5 I2C master (D14,D15); //configure pins p27,p28 as I2C master
sakthipriya 0:67b7e9f8d9b0 6 Serial pc (USBTX,USBRX);
sakthipriya 0:67b7e9f8d9b0 7 DigitalOut interrupt(D9);
sakthipriya 0:67b7e9f8d9b0 8 InterruptIn data_ready(D10);
sakthipriya 0:67b7e9f8d9b0 9
sakthipriya 0:67b7e9f8d9b0 10 int reset;
sakthipriya 0:67b7e9f8d9b0 11
sakthipriya 0:67b7e9f8d9b0 12 typedef struct
sakthipriya 0:67b7e9f8d9b0 13 {
sakthipriya 0:67b7e9f8d9b0 14 char data; // To avoid dynamic memory allocation
sakthipriya 0:67b7e9f8d9b0 15 int length;
sakthipriya 0:67b7e9f8d9b0 16 }i2c_data;
sakthipriya 0:67b7e9f8d9b0 17
sakthipriya 0:67b7e9f8d9b0 18 typedef struct
sakthipriya 0:67b7e9f8d9b0 19 {
sakthipriya 0:67b7e9f8d9b0 20 char data[40]; // To avoid dynamic memory allocation
sakthipriya 0:67b7e9f8d9b0 21 }i2c_hk_data;
sakthipriya 0:67b7e9f8d9b0 22
sakthipriya 0:67b7e9f8d9b0 23 Mail<i2c_hk_data,16> i2c_data_receive;
sakthipriya 0:67b7e9f8d9b0 24 Mail<i2c_data,16> i2c_data_send;
sakthipriya 0:67b7e9f8d9b0 25
sakthipriya 0:67b7e9f8d9b0 26 Thread * ptr_t_i2c;
sakthipriya 0:67b7e9f8d9b0 27 void FUNC_I2C_MASTER_FSLAVE(char * data,int length=40)
sakthipriya 0:67b7e9f8d9b0 28 {
sakthipriya 0:67b7e9f8d9b0 29 //printf("press backspace for master to start \n\r");
sakthipriya 0:67b7e9f8d9b0 30 //while(1){
sakthipriya 0:67b7e9f8d9b0 31 //interrupt = 0;
sakthipriya 0:67b7e9f8d9b0 32 // if(pc.getc()=='z'){
sakthipriya 0:67b7e9f8d9b0 33 wait(0.5);
sakthipriya 0:67b7e9f8d9b0 34 interrupt = 1;
sakthipriya 0:67b7e9f8d9b0 35 printf("\nMaster executed\n");
sakthipriya 0:67b7e9f8d9b0 36
sakthipriya 0:67b7e9f8d9b0 37
sakthipriya 0:67b7e9f8d9b0 38 bool ack0 =true;
sakthipriya 0:67b7e9f8d9b0 39 bool loopvariable0 =true;
sakthipriya 0:67b7e9f8d9b0 40 //char *data = new char;
sakthipriya 0:67b7e9f8d9b0 41 //*data = 'b';
sakthipriya 0:67b7e9f8d9b0 42
sakthipriya 0:67b7e9f8d9b0 43
sakthipriya 0:67b7e9f8d9b0 44
sakthipriya 0:67b7e9f8d9b0 45 master.frequency(100000); //set clock frequency
sakthipriya 0:67b7e9f8d9b0 46 //master.start();
sakthipriya 0:67b7e9f8d9b0 47 /*while(write2slave)
sakthipriya 0:67b7e9f8d9b0 48 { *writedata = pc.getc();
sakthipriya 0:67b7e9f8d9b0 49 wait(0.5);
sakthipriya 0:67b7e9f8d9b0 50
sakthipriya 0:67b7e9f8d9b0 51 printf("master clk freq setup and addressing slave\n\r");
sakthipriya 0:67b7e9f8d9b0 52 master.start(); //initiating the data transfer
sakthipriya 0:67b7e9f8d9b0 53 master_status_write = (bool) master.write(addr|0x00,writedata,1);
sakthipriya 0:67b7e9f8d9b0 54 if(master_status_write==0)
sakthipriya 0:67b7e9f8d9b0 55 {
sakthipriya 0:67b7e9f8d9b0 56 printf("master has written %c to slave\n\r",*writedata);
sakthipriya 0:67b7e9f8d9b0 57 write2slave=false;
sakthipriya 0:67b7e9f8d9b0 58 }
sakthipriya 0:67b7e9f8d9b0 59
sakthipriya 0:67b7e9f8d9b0 60
sakthipriya 0:67b7e9f8d9b0 61 }*/
sakthipriya 0:67b7e9f8d9b0 62
sakthipriya 0:67b7e9f8d9b0 63 while(ack0)
sakthipriya 0:67b7e9f8d9b0 64 {
sakthipriya 0:67b7e9f8d9b0 65 //printf("2 master clk freq setup and addressing slave\n\r");
sakthipriya 0:67b7e9f8d9b0 66
sakthipriya 0:67b7e9f8d9b0 67 master.start(); //initiating the data transfer
sakthipriya 0:67b7e9f8d9b0 68 ack0 = master.read(addr,data,length);
sakthipriya 0:67b7e9f8d9b0 69 }
sakthipriya 0:67b7e9f8d9b0 70 if(!ack0)
sakthipriya 0:67b7e9f8d9b0 71 {
sakthipriya 0:67b7e9f8d9b0 72 printf("\n master has read %c from slave\n\r",*data);
sakthipriya 0:67b7e9f8d9b0 73 loopvariable0=false;
sakthipriya 0:67b7e9f8d9b0 74 }
sakthipriya 0:67b7e9f8d9b0 75 //master.stop();
sakthipriya 0:67b7e9f8d9b0 76
sakthipriya 0:67b7e9f8d9b0 77 //printf("done\n\r");
sakthipriya 0:67b7e9f8d9b0 78 //delete data;
sakthipriya 0:67b7e9f8d9b0 79 interrupt=0;
sakthipriya 0:67b7e9f8d9b0 80 }
sakthipriya 0:67b7e9f8d9b0 81
sakthipriya 0:67b7e9f8d9b0 82 void T_I2C_MASTER_FSLAVE(void const *args)
sakthipriya 0:67b7e9f8d9b0 83 {
sakthipriya 0:67b7e9f8d9b0 84 char data_receive[40];
sakthipriya 0:67b7e9f8d9b0 85 while(1)
sakthipriya 0:67b7e9f8d9b0 86 {
sakthipriya 0:67b7e9f8d9b0 87 Thread::signal_wait(0x1);
sakthipriya 0:67b7e9f8d9b0 88 FUNC_I2C_MASTER_FSLAVE(data_receive,40);
sakthipriya 0:67b7e9f8d9b0 89 i2c_hk_data * i2c_hk_data_r = i2c_data_receive.alloc();
sakthipriya 0:67b7e9f8d9b0 90 strcpy(i2c_hk_data_r->data,data_receive);
sakthipriya 0:67b7e9f8d9b0 91 i2c_data_receive.put(i2c_hk_data_r);
sakthipriya 0:67b7e9f8d9b0 92 printf("\n Data received from slave is %s\n\r",data_receive);
sakthipriya 0:67b7e9f8d9b0 93 i2c_data_receive.free(i2c_hk_data_r);
sakthipriya 0:67b7e9f8d9b0 94 }
sakthipriya 0:67b7e9f8d9b0 95 }
sakthipriya 0:67b7e9f8d9b0 96
sakthipriya 0:67b7e9f8d9b0 97 void FUNC_INT()
sakthipriya 0:67b7e9f8d9b0 98 {
sakthipriya 0:67b7e9f8d9b0 99
sakthipriya 0:67b7e9f8d9b0 100 ptr_t_i2c->signal_set(0x1);
sakthipriya 0:67b7e9f8d9b0 101
sakthipriya 0:67b7e9f8d9b0 102 }
sakthipriya 0:67b7e9f8d9b0 103
sakthipriya 0:67b7e9f8d9b0 104 char *writedata = new char;
sakthipriya 0:67b7e9f8d9b0 105 void FUNC_MASTER_WRITE()
sakthipriya 0:67b7e9f8d9b0 106 {
sakthipriya 0:67b7e9f8d9b0 107 bool write2slave=true;
sakthipriya 0:67b7e9f8d9b0 108
sakthipriya 0:67b7e9f8d9b0 109 interrupt = 0;
sakthipriya 0:67b7e9f8d9b0 110
sakthipriya 0:67b7e9f8d9b0 111 char data = pc.getc();
sakthipriya 0:67b7e9f8d9b0 112 i2c_data * i2c_data_s = i2c_data_send.alloc();
sakthipriya 0:67b7e9f8d9b0 113 i2c_data_s->data = data;
sakthipriya 0:67b7e9f8d9b0 114 i2c_data_s->length = 1;
sakthipriya 0:67b7e9f8d9b0 115 i2c_data_send.put(i2c_data_s);
sakthipriya 0:67b7e9f8d9b0 116 bool master_status_write = true;
sakthipriya 0:67b7e9f8d9b0 117 interrupt = 1;
sakthipriya 0:67b7e9f8d9b0 118 osEvent evt = i2c_data_send.get();
sakthipriya 0:67b7e9f8d9b0 119 if (evt.status == osEventMail)
sakthipriya 0:67b7e9f8d9b0 120 {
sakthipriya 0:67b7e9f8d9b0 121 i2c_data *i2c_data_s = (i2c_data*)evt.value.p;
sakthipriya 0:67b7e9f8d9b0 122 *writedata = i2c_data_s -> data;
sakthipriya 0:67b7e9f8d9b0 123 master.frequency(100000); //set clock frequency
sakthipriya 0:67b7e9f8d9b0 124 while(write2slave)
sakthipriya 0:67b7e9f8d9b0 125 {
sakthipriya 0:67b7e9f8d9b0 126 printf("master clk freq setup and addressing slave\n\r");
sakthipriya 0:67b7e9f8d9b0 127 master.start(); //initiating the data transfer
sakthipriya 0:67b7e9f8d9b0 128 master_status_write = (bool) master.write(addr|0x00,writedata,1);
sakthipriya 0:67b7e9f8d9b0 129 if(master_status_write==0)
sakthipriya 0:67b7e9f8d9b0 130 {
sakthipriya 0:67b7e9f8d9b0 131 printf("master has written %c to slave\n\r",*writedata);
sakthipriya 0:67b7e9f8d9b0 132 write2slave=false;
sakthipriya 0:67b7e9f8d9b0 133 }
sakthipriya 0:67b7e9f8d9b0 134
sakthipriya 0:67b7e9f8d9b0 135 }
sakthipriya 0:67b7e9f8d9b0 136 i2c_data_send.free(i2c_data_s);
sakthipriya 0:67b7e9f8d9b0 137 }
sakthipriya 0:67b7e9f8d9b0 138 }
sakthipriya 0:67b7e9f8d9b0 139
sakthipriya 0:67b7e9f8d9b0 140
sakthipriya 0:67b7e9f8d9b0 141
sakthipriya 0:67b7e9f8d9b0 142 int main()
sakthipriya 0:67b7e9f8d9b0 143 {
sakthipriya 0:67b7e9f8d9b0 144 ptr_t_i2c = new Thread(T_I2C_MASTER_FSLAVE);
sakthipriya 0:67b7e9f8d9b0 145 data_ready.rise(&FUNC_INT);
sakthipriya 0:67b7e9f8d9b0 146 printf("\nstarted master\n");
sakthipriya 0:67b7e9f8d9b0 147 while(1)
sakthipriya 0:67b7e9f8d9b0 148 {
sakthipriya 0:67b7e9f8d9b0 149 FUNC_MASTER_WRITE();
sakthipriya 0:67b7e9f8d9b0 150
sakthipriya 0:67b7e9f8d9b0 151 }
sakthipriya 0:67b7e9f8d9b0 152 }