alan broad
/
carbon_v5_arm_studio
arm studio build
Diff: src/commI2C.cpp
- Revision:
- 0:a91cd1b08360
- Child:
- 2:0af50f386eb2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/commI2C.cpp Mon Jun 18 17:31:35 2018 +0000 @@ -0,0 +1,125 @@ +#include "mbed.h" +#include "commI2C.h" + +extern uint8_t buf_xmt[BUFFER_SIZE_I2C]; //outgoing data +extern uint8_t buf_rcv[BUFFER_SIZE_I2C]; //incoming data +I2CSlave slave(PB_9, PB_8); +DigitalInOut wake(PA_0); + +extern Serial pc; +//#define TEST + + +//============================================================================== +// i2c_proc_init +// - init i2c comm to proc +//============================================================================== +void i2c_proc_init() +{ + slave.frequency(100000); // added DRT NOT NEEDED BY SLAVE????,asb, need this ???? + uint8_t slave_address = 0xA0; //PROC code uses 7bit address shifted by one so 0xA0 (xdot) => 0x50 (PROC) + slave.address(slave_address); + //set wake hi + + return; +} +//============================================================================== +// i2c_wait4wake_lo +// - wait for the wake signal from proc to go low +// NEEDS TO BE CORRECTED, THIS WAITS FOR A HI THEN A LOW !!!! +//============================================================================== +#ifdef NOT_USED +void i2c_wait4wake_lo(void){ + wake.input(); +// pc.printf("\n\r waiting for wake to go hi %d",wake); + bool wakeHi= false; + while(!wakeHi){ + wait_ms(10); //need this wait else loop below will block previous printout + wakeHi = wake; // state of wake signal + } + // pc.printf("\n\r detected wake hi"); + wait_ms(100); //need this wait else loop below will block previous printout + //wake signal hi,wait until it goes back lo => psoc is going to wait for .... + // pc.printf("\n\r waiting for wake to go lo %d",wake); + bool wakeLo = true; + while(wakeLo){ + wait_ms(10); //need this wait else loop below will block previous printout + wakeLo = wake; // state of wake signal + } + //pc.printf("\n\r detected wake lo "); + wait_ms(100); //wait for proc to get ready for i2c comm, proc leave wake in low state + + + return; +} +#endif +//============================================================================== +// i2c_pulse_wake +// - pulse the wake signal to tell proc that xdot ready for i2c xfr +//============================================================================== +void i2c_pulse_wake(void){ + wake.mode(OpenDrain); + wake.output(); + wake = 1; + wait_ms(10); //proc uses interrupts on lora_wake, so don't need to wait,just pulse it + wake = 0; // set wake lo + wait_ms(1); + wake.input(); //go back to input mode !!! wake pull hi if go back to input mode ??? + return; +} +//============================================================================== +// i2c_proc_comm +//- set WAKE low to notify proc that's OK to read/write i2c data +//- waits FOREVER or timeout for proc to write or read i2 data +// - returns point to read or write i2c bfr +//- returns true if xdot rcvd data into buf_rcv from proc +// false if xdot wrote data from buf_xmt to proc +//- before returning sets WAKE hi +//------------------------------------------------------------------------------ +// xdot i2c slave operation: +// - xdot does not work correctly as a i2c slave +// - if xdot does not respond to first incoming bytes from master (responseTime) +// within a defined period the xdot will hang the i2c bus until it is reset +// - the strategy here is sit in a very tight while loop polling continually for +// incoming i2c bytee within the respnseTime +// - the time around the while loop below must be < responseTime +// - reponseTime for the while loop below is measured at 1.25 usec +// - responseTimes upto 80 usec have been measured to be OK +//------------------------------------------------------------------------------ +// timeout: +// - safety mechanism to get xdot back to sleep mode if proc goes unresponsive +// - cpu clock dependant..what mhz is cpu? presently this will give 1.1sec timout before +// - 0x000fffff gives a 1.1 second timeout +// - after proc wakes xdot from sleep then proc must send an i2c omd within timout +// - once xdot pulses wake to notify proc that i2c ack msg is ready, proc must do i2c read within timeout +//============================================================================== +I2C_XFR_TYPE i2c_proc_comm(void) +{ + bool verbose = false; + uint32_t timeout = 0x000fffff; //1.1second timeout + + while(1){ + int i = slave.receive(); + switch (i) { + case I2CSlave::ReadAddressed: //xdot -> proc + slave.write((char *)buf_xmt, BUFFER_SIZE_I2C); + return I2C_WRITE; + case I2CSlave::WriteAddressed: //xdot <- proc + slave.read((char *)buf_rcv, BUFFER_SIZE_I2C); + if (verbose){ + pc.printf("\n\r Incoming buffer(hex): \n\r"); + int j; + for (j = 0; j < BUFFER_SIZE_I2C; j++){ + pc.printf("%x", buf_rcv[j]); + pc.printf(" "); + } + + } + return I2C_READ; + default: + }; //switch + + timeout--; + if(timeout == 0)return I2C_WRITE; //just go to sleep + }; //while +} \ No newline at end of file