alan broad
/
carbon_v5_arm_studio
arm studio build
src/commI2C.cpp@18:d95e1a2c4303, 2019-01-27 (annotated)
- 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?
User | Revision | Line number | New 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 | } |