arm studio build

Dependencies:   libxDot-mbed5

Committer:
alan1974
Date:
Sun Jan 27 15:27:53 2019 +0000
Revision:
18:d95e1a2c4303
Parent:
17:74d60177c6b6
Child:
26:f51ff4ad7a93
exit from end of mcast session (Class C) -> ClassA completed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alan1974 0:a91cd1b08360 1 #include "mbed.h"
alan1974 2:0af50f386eb2 2 #include "global.h"
alan1974 0:a91cd1b08360 3 #include "commI2C.h"
alan1974 0:a91cd1b08360 4
alan1974 0:a91cd1b08360 5 extern uint8_t buf_xmt[BUFFER_SIZE_I2C]; //outgoing data
alan1974 0:a91cd1b08360 6 extern uint8_t buf_rcv[BUFFER_SIZE_I2C]; //incoming data
alan1974 0:a91cd1b08360 7 I2CSlave slave(PB_9, PB_8);
alan1974 0:a91cd1b08360 8 DigitalInOut wake(PA_0);
alan1974 0:a91cd1b08360 9
alan1974 0:a91cd1b08360 10 extern Serial pc;
alan1974 5:abfe25f0de33 11 extern bool verbose;
alan1974 18:d95e1a2c4303 12 //#define TEST
alan1974 0:a91cd1b08360 13 //==============================================================================
alan1974 0:a91cd1b08360 14 // i2c_proc_init
alan1974 0:a91cd1b08360 15 // - init i2c comm to proc
alan1974 0:a91cd1b08360 16 //==============================================================================
alan1974 0:a91cd1b08360 17 void i2c_proc_init()
alan1974 0:a91cd1b08360 18 {
alan1974 0:a91cd1b08360 19 slave.frequency(100000); // added DRT NOT NEEDED BY SLAVE????,asb, need this ????
alan1974 0:a91cd1b08360 20 uint8_t slave_address = 0xA0; //PROC code uses 7bit address shifted by one so 0xA0 (xdot) => 0x50 (PROC)
alan1974 17:74d60177c6b6 21 slave.address(slave_address);
alan1974 0:a91cd1b08360 22 return;
alan1974 0:a91cd1b08360 23 }
alan1974 0:a91cd1b08360 24 //==============================================================================
alan1974 0:a91cd1b08360 25 // i2c_wait4wake_lo
alan1974 0:a91cd1b08360 26 // - wait for the wake signal from proc to go low
alan1974 0:a91cd1b08360 27 // NEEDS TO BE CORRECTED, THIS WAITS FOR A HI THEN A LOW !!!!
alan1974 17:74d60177c6b6 28 //==============================================================================
alan1974 17:74d60177c6b6 29 /*
alan1974 17:74d60177c6b6 30 //#ifdef NOT_USED
alan1974 0:a91cd1b08360 31 void i2c_wait4wake_lo(void){
alan1974 0:a91cd1b08360 32 wake.input();
alan1974 5:abfe25f0de33 33 // if(verbose)pc.printf("\n\r waiting for wake to go hi %d",wake);
alan1974 0:a91cd1b08360 34 bool wakeHi= false;
alan1974 0:a91cd1b08360 35 while(!wakeHi){
alan1974 0:a91cd1b08360 36 wait_ms(10); //need this wait else loop below will block previous printout
alan1974 0:a91cd1b08360 37 wakeHi = wake; // state of wake signal
alan1974 0:a91cd1b08360 38 }
alan1974 5:abfe25f0de33 39 // if(verbose)pc.printf("\n\r detected wake hi");
alan1974 0:a91cd1b08360 40 wait_ms(100); //need this wait else loop below will block previous printout
alan1974 0:a91cd1b08360 41 //wake signal hi,wait until it goes back lo => psoc is going to wait for ....
alan1974 5:abfe25f0de33 42 // if(verbose)pc.printf("\n\r waiting for wake to go lo %d",wake);
alan1974 0:a91cd1b08360 43 bool wakeLo = true;
alan1974 0:a91cd1b08360 44 while(wakeLo){
alan1974 0:a91cd1b08360 45 wait_ms(10); //need this wait else loop below will block previous printout
alan1974 0:a91cd1b08360 46 wakeLo = wake; // state of wake signal
alan1974 0:a91cd1b08360 47 }
alan1974 5:abfe25f0de33 48 //if(verbose)pc.printf("\n\r detected wake lo ");
alan1974 0:a91cd1b08360 49 wait_ms(100); //wait for proc to get ready for i2c comm, proc leave wake in low state
alan1974 0:a91cd1b08360 50
alan1974 0:a91cd1b08360 51
alan1974 0:a91cd1b08360 52 return;
alan1974 0:a91cd1b08360 53 }
alan1974 17:74d60177c6b6 54 //#endif
alan1974 17:74d60177c6b6 55 */
alan1974 0:a91cd1b08360 56 //==============================================================================
alan1974 0:a91cd1b08360 57 // i2c_pulse_wake
alan1974 0:a91cd1b08360 58 // - pulse the wake signal to tell proc that xdot ready for i2c xfr
alan1974 0:a91cd1b08360 59 //==============================================================================
alan1974 0:a91cd1b08360 60 void i2c_pulse_wake(void){
alan1974 0:a91cd1b08360 61 wake.mode(OpenDrain);
alan1974 0:a91cd1b08360 62 wake.output();
alan1974 0:a91cd1b08360 63 wake = 1;
alan1974 18:d95e1a2c4303 64 wait_ms(10); //proc uses interrupts on lora_wake, so don't need to wait,just pulse it
alan1974 18:d95e1a2c4303 65 wake = 0; //set wake lo
alan1974 0:a91cd1b08360 66 wait_ms(1);
alan1974 0:a91cd1b08360 67 wake.input(); //go back to input mode !!! wake pull hi if go back to input mode ???
alan1974 0:a91cd1b08360 68 return;
alan1974 0:a91cd1b08360 69 }
alan1974 0:a91cd1b08360 70 //==============================================================================
alan1974 0:a91cd1b08360 71 // i2c_proc_comm
alan1974 0:a91cd1b08360 72 //- set WAKE low to notify proc that's OK to read/write i2c data
alan1974 0:a91cd1b08360 73 //- waits FOREVER or timeout for proc to write or read i2 data
alan1974 0:a91cd1b08360 74 // - returns point to read or write i2c bfr
alan1974 0:a91cd1b08360 75 //- returns true if xdot rcvd data into buf_rcv from proc
alan1974 0:a91cd1b08360 76 // false if xdot wrote data from buf_xmt to proc
alan1974 0:a91cd1b08360 77 //- before returning sets WAKE hi
alan1974 0:a91cd1b08360 78 //------------------------------------------------------------------------------
alan1974 0:a91cd1b08360 79 // xdot i2c slave operation:
alan1974 0:a91cd1b08360 80 // - xdot does not work correctly as a i2c slave
alan1974 0:a91cd1b08360 81 // - if xdot does not respond to first incoming bytes from master (responseTime)
alan1974 0:a91cd1b08360 82 // within a defined period the xdot will hang the i2c bus until it is reset
alan1974 8:a5316708e51d 83 // - the strategy here is sit in a very tight "while loop" polling continually for
alan1974 0:a91cd1b08360 84 // incoming i2c bytee within the respnseTime
alan1974 8:a5316708e51d 85 // - time around the "while loop" must be < "responseTime"
alan1974 8:a5316708e51d 86 // - "while loop" is measured at 1.25 usec
alan1974 0:a91cd1b08360 87 // - responseTimes upto 80 usec have been measured to be OK
alan1974 0:a91cd1b08360 88 //------------------------------------------------------------------------------
alan1974 0:a91cd1b08360 89 // timeout:
alan1974 0:a91cd1b08360 90 // - safety mechanism to get xdot back to sleep mode if proc goes unresponsive
alan1974 0:a91cd1b08360 91 // - cpu clock dependant..what mhz is cpu? presently this will give 1.1sec timout before
alan1974 0:a91cd1b08360 92 // - 0x000fffff gives a 1.1 second timeout
alan1974 0:a91cd1b08360 93 // - after proc wakes xdot from sleep then proc must send an i2c omd within timout
alan1974 0:a91cd1b08360 94 // - once xdot pulses wake to notify proc that i2c ack msg is ready, proc must do i2c read within timeout
alan1974 18:d95e1a2c4303 95 // Jan2019: modified to handle large mcast code frags
alan1974 18:d95e1a2c4303 96 // - Input parameters:
alan1974 18:d95e1a2c4303 97 // buf_xmt: pointer to buffer containing I2C data for transfer to psco
alan1974 18:d95e1a2c4303 98 // buf_rcv: pointer to buffer continaing I2C data for transfer from psoc
alan1974 0:a91cd1b08360 99 //==============================================================================
alan1974 18:d95e1a2c4303 100 I2C_XFR_TYPE i2c_proc_comm(uint8_t *buf_xmt,uint8_t *buf_rcv,uint16_t bufSize)
alan1974 0:a91cd1b08360 101 {
alan1974 0:a91cd1b08360 102 uint32_t timeout = 0x000fffff; //1.1second timeout
alan1974 0:a91cd1b08360 103
alan1974 0:a91cd1b08360 104 while(1){
alan1974 0:a91cd1b08360 105 int i = slave.receive();
alan1974 0:a91cd1b08360 106 switch (i) {
alan1974 8:a5316708e51d 107 case I2CSlave::ReadAddressed: //xdot -> proc
alan1974 18:d95e1a2c4303 108 slave.write((char *)buf_xmt,bufSize);
alan1974 0:a91cd1b08360 109 return I2C_WRITE;
alan1974 0:a91cd1b08360 110 case I2CSlave::WriteAddressed: //xdot <- proc
alan1974 18:d95e1a2c4303 111 slave.read((char *)buf_rcv,bufSize);
alan1974 5:abfe25f0de33 112 /*
alan1974 0:a91cd1b08360 113 if (verbose){
alan1974 0:a91cd1b08360 114 pc.printf("\n\r Incoming buffer(hex): \n\r");
alan1974 0:a91cd1b08360 115 int j;
alan1974 0:a91cd1b08360 116 for (j = 0; j < BUFFER_SIZE_I2C; j++){
alan1974 5:abfe25f0de33 117 pc.printf("%x", buf_rcv[j]);
alan1974 5:abfe25f0de33 118 pc.printf(" ");
alan1974 5:abfe25f0de33 119 }
alan1974 0:a91cd1b08360 120 }
alan1974 5:abfe25f0de33 121 */
alan1974 0:a91cd1b08360 122 return I2C_READ;
alan1974 0:a91cd1b08360 123 default:
alan1974 0:a91cd1b08360 124 }; //switch
alan1974 0:a91cd1b08360 125
alan1974 0:a91cd1b08360 126 timeout--;
alan1974 9:cc23b2049639 127 if(timeout == 0){
alan1974 9:cc23b2049639 128 pc.printf("\r\n I2C TIMEOUT");
alan1974 9:cc23b2049639 129 return I2C_WRITE; //just go to sleep
alan1974 9:cc23b2049639 130 }
alan1974 0:a91cd1b08360 131 }; //while
alan1974 0:a91cd1b08360 132 }