testing

Dependencies:   BLE_API mbed nRF51822

Committer:
leighton_corr
Date:
Sun Sep 17 21:51:23 2017 +0000
Revision:
0:01674c0ff0b0
test1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
leighton_corr 0:01674c0ff0b0 1
leighton_corr 0:01674c0ff0b0 2 /*
leighton_corr 0:01674c0ff0b0 3
leighton_corr 0:01674c0ff0b0 4 Copyright (c) 2014 RedBearLab, All rights reserved.
leighton_corr 0:01674c0ff0b0 5
leighton_corr 0:01674c0ff0b0 6 This library is free software; you can redistribute it and/or
leighton_corr 0:01674c0ff0b0 7 modify it under the terms of the GNU Lesser General Public
leighton_corr 0:01674c0ff0b0 8 License as published by the Free Software Foundation; either
leighton_corr 0:01674c0ff0b0 9 version 2.1 of the License, or (at your option) any later version.
leighton_corr 0:01674c0ff0b0 10
leighton_corr 0:01674c0ff0b0 11 This library is distributed in the hope that it will be useful,
leighton_corr 0:01674c0ff0b0 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
leighton_corr 0:01674c0ff0b0 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
leighton_corr 0:01674c0ff0b0 14 See the GNU Lesser General Public License for more details.
leighton_corr 0:01674c0ff0b0 15
leighton_corr 0:01674c0ff0b0 16 You should have received a copy of the GNU Lesser General Public
leighton_corr 0:01674c0ff0b0 17 License along with this library; if not, write to the Free Software
leighton_corr 0:01674c0ff0b0 18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
leighton_corr 0:01674c0ff0b0 19
leighton_corr 0:01674c0ff0b0 20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
leighton_corr 0:01674c0ff0b0 21 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
leighton_corr 0:01674c0ff0b0 22 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
leighton_corr 0:01674c0ff0b0 23 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
leighton_corr 0:01674c0ff0b0 24 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
leighton_corr 0:01674c0ff0b0 25 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
leighton_corr 0:01674c0ff0b0 26 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
leighton_corr 0:01674c0ff0b0 27
leighton_corr 0:01674c0ff0b0 28 */
leighton_corr 0:01674c0ff0b0 29
leighton_corr 0:01674c0ff0b0 30 #include "wire.h"
leighton_corr 0:01674c0ff0b0 31 #include "nrf_soc.h"
leighton_corr 0:01674c0ff0b0 32 #include "nrf_sdm.h"
leighton_corr 0:01674c0ff0b0 33
leighton_corr 0:01674c0ff0b0 34 //extern Serial pc;
leighton_corr 0:01674c0ff0b0 35 /**********************************************************************
leighton_corr 0:01674c0ff0b0 36 name :
leighton_corr 0:01674c0ff0b0 37 function : return: 0--SUCCESS, 1--FAIL
leighton_corr 0:01674c0ff0b0 38 **********************************************************************/
leighton_corr 0:01674c0ff0b0 39 bool TwoWire::twi_master_clear_bus(void)
leighton_corr 0:01674c0ff0b0 40 {
leighton_corr 0:01674c0ff0b0 41 bool bus_clear;
leighton_corr 0:01674c0ff0b0 42 uint32_t twi_state;
leighton_corr 0:01674c0ff0b0 43 uint32_t sck_pin_config;
leighton_corr 0:01674c0ff0b0 44 uint32_t sda_pin_config;
leighton_corr 0:01674c0ff0b0 45
leighton_corr 0:01674c0ff0b0 46 twi_state = twi->ENABLE;
leighton_corr 0:01674c0ff0b0 47 twi->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
leighton_corr 0:01674c0ff0b0 48
leighton_corr 0:01674c0ff0b0 49 sck_pin_config = NRF_GPIO->PIN_CNF[SCL_Pin];
leighton_corr 0:01674c0ff0b0 50 NRF_GPIO->PIN_CNF[SCL_Pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
leighton_corr 0:01674c0ff0b0 51 | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos)
leighton_corr 0:01674c0ff0b0 52 | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
leighton_corr 0:01674c0ff0b0 53 | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
leighton_corr 0:01674c0ff0b0 54 | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
leighton_corr 0:01674c0ff0b0 55
leighton_corr 0:01674c0ff0b0 56 sda_pin_config = NRF_GPIO->PIN_CNF[SDA_Pin];
leighton_corr 0:01674c0ff0b0 57 NRF_GPIO->PIN_CNF[SDA_Pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
leighton_corr 0:01674c0ff0b0 58 | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos)
leighton_corr 0:01674c0ff0b0 59 | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
leighton_corr 0:01674c0ff0b0 60 | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
leighton_corr 0:01674c0ff0b0 61 | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
leighton_corr 0:01674c0ff0b0 62
leighton_corr 0:01674c0ff0b0 63 NRF_GPIO->OUTSET = ( 1 << SCL_Pin );
leighton_corr 0:01674c0ff0b0 64 NRF_GPIO->OUTSET = ( 1 << SDA_Pin );
leighton_corr 0:01674c0ff0b0 65 TWI_DELAY(4);
leighton_corr 0:01674c0ff0b0 66
leighton_corr 0:01674c0ff0b0 67 if( ( (NRF_GPIO->IN >> SCL_Pin) & 0X1UL ) && ( (NRF_GPIO->IN >> SDA_Pin) & 0x1UL ) )
leighton_corr 0:01674c0ff0b0 68 {
leighton_corr 0:01674c0ff0b0 69 bus_clear = 0;
leighton_corr 0:01674c0ff0b0 70 }
leighton_corr 0:01674c0ff0b0 71 else
leighton_corr 0:01674c0ff0b0 72 {
leighton_corr 0:01674c0ff0b0 73 uint_fast8_t index;
leighton_corr 0:01674c0ff0b0 74 bus_clear = 1;
leighton_corr 0:01674c0ff0b0 75 for( index=18; index--;)
leighton_corr 0:01674c0ff0b0 76 {
leighton_corr 0:01674c0ff0b0 77 NRF_GPIO->OUTCLR = ( 1 << SCL_Pin );
leighton_corr 0:01674c0ff0b0 78 TWI_DELAY(4);
leighton_corr 0:01674c0ff0b0 79 NRF_GPIO->OUTSET = ( 1 << SDA_Pin );
leighton_corr 0:01674c0ff0b0 80 TWI_DELAY(4);
leighton_corr 0:01674c0ff0b0 81
leighton_corr 0:01674c0ff0b0 82 if( (NRF_GPIO->IN >> SDA_Pin) & 0x1UL == 1 )
leighton_corr 0:01674c0ff0b0 83 {
leighton_corr 0:01674c0ff0b0 84 bus_clear = 0;
leighton_corr 0:01674c0ff0b0 85 break;
leighton_corr 0:01674c0ff0b0 86 }
leighton_corr 0:01674c0ff0b0 87 }
leighton_corr 0:01674c0ff0b0 88 }
leighton_corr 0:01674c0ff0b0 89
leighton_corr 0:01674c0ff0b0 90 NRF_GPIO->PIN_CNF[SCL_Pin] = sck_pin_config;
leighton_corr 0:01674c0ff0b0 91 NRF_GPIO->PIN_CNF[SDA_Pin] = sda_pin_config;
leighton_corr 0:01674c0ff0b0 92
leighton_corr 0:01674c0ff0b0 93 twi->ENABLE = twi_state;
leighton_corr 0:01674c0ff0b0 94
leighton_corr 0:01674c0ff0b0 95 return bus_clear;
leighton_corr 0:01674c0ff0b0 96 }
leighton_corr 0:01674c0ff0b0 97
leighton_corr 0:01674c0ff0b0 98 /**********************************************************************
leighton_corr 0:01674c0ff0b0 99 name :
leighton_corr 0:01674c0ff0b0 100 function : return: 0--SUCCESS, 1--FAIL
leighton_corr 0:01674c0ff0b0 101 **********************************************************************/
leighton_corr 0:01674c0ff0b0 102 bool TwoWire::twi_master_init(void)
leighton_corr 0:01674c0ff0b0 103 {
leighton_corr 0:01674c0ff0b0 104 uint8_t softdevice_enabled;
leighton_corr 0:01674c0ff0b0 105 //uint32_t err_code = NRF_SUCCESS;
leighton_corr 0:01674c0ff0b0 106
leighton_corr 0:01674c0ff0b0 107 NRF_GPIO->PIN_CNF[SCL_Pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
leighton_corr 0:01674c0ff0b0 108 | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos)
leighton_corr 0:01674c0ff0b0 109 | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
leighton_corr 0:01674c0ff0b0 110 | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
leighton_corr 0:01674c0ff0b0 111 | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos);
leighton_corr 0:01674c0ff0b0 112
leighton_corr 0:01674c0ff0b0 113 NRF_GPIO->PIN_CNF[SDA_Pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
leighton_corr 0:01674c0ff0b0 114 | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos)
leighton_corr 0:01674c0ff0b0 115 | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
leighton_corr 0:01674c0ff0b0 116 | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
leighton_corr 0:01674c0ff0b0 117 | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos);
leighton_corr 0:01674c0ff0b0 118
leighton_corr 0:01674c0ff0b0 119 twi->EVENTS_RXDREADY = 0;
leighton_corr 0:01674c0ff0b0 120 twi->EVENTS_TXDSENT = 0;
leighton_corr 0:01674c0ff0b0 121 twi->PSELSCL = SCL_Pin;
leighton_corr 0:01674c0ff0b0 122 twi->PSELSDA = SDA_Pin;
leighton_corr 0:01674c0ff0b0 123 twi->FREQUENCY = twi_frequency; //TWI_FREQUENCY_FREQUENCY_K100 << TWI_FREQUENCY_FREQUENCY_Pos;
leighton_corr 0:01674c0ff0b0 124
leighton_corr 0:01674c0ff0b0 125 sd_softdevice_is_enabled(&softdevice_enabled);
leighton_corr 0:01674c0ff0b0 126 //APP_ERROR_CHECK(err_code);
leighton_corr 0:01674c0ff0b0 127 if (softdevice_enabled == 0)
leighton_corr 0:01674c0ff0b0 128 {
leighton_corr 0:01674c0ff0b0 129 NRF_PPI->CH[7].EEP = (uint32_t)&twi->EVENTS_BB;
leighton_corr 0:01674c0ff0b0 130 NRF_PPI->CH[7].TEP = (uint32_t)&twi->TASKS_SUSPEND;
leighton_corr 0:01674c0ff0b0 131 NRF_PPI->CHEN &= ~(1 << 7);
leighton_corr 0:01674c0ff0b0 132 }
leighton_corr 0:01674c0ff0b0 133 else
leighton_corr 0:01674c0ff0b0 134 {
leighton_corr 0:01674c0ff0b0 135 sd_ppi_channel_assign(7, &twi->EVENTS_BB, &twi->TASKS_SUSPEND);
leighton_corr 0:01674c0ff0b0 136 //APP_ERROR_CHECK(err_code);
leighton_corr 0:01674c0ff0b0 137 sd_ppi_channel_enable_clr(1 << 7);
leighton_corr 0:01674c0ff0b0 138 //APP_ERROR_CHECK(err_code);
leighton_corr 0:01674c0ff0b0 139 }
leighton_corr 0:01674c0ff0b0 140
leighton_corr 0:01674c0ff0b0 141 twi->ENABLE = TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos;
leighton_corr 0:01674c0ff0b0 142
leighton_corr 0:01674c0ff0b0 143 return twi_master_clear_bus();
leighton_corr 0:01674c0ff0b0 144 }
leighton_corr 0:01674c0ff0b0 145 /**********************************************************************
leighton_corr 0:01674c0ff0b0 146 name :
leighton_corr 0:01674c0ff0b0 147 function : return: 0--SUCCESS, 1--FAIL
leighton_corr 0:01674c0ff0b0 148 **********************************************************************/
leighton_corr 0:01674c0ff0b0 149 uint8_t TwoWire::twi_master_write(uint8_t *data, uint8_t data_length, uint8_t issue_stop_condition)
leighton_corr 0:01674c0ff0b0 150 {
leighton_corr 0:01674c0ff0b0 151 uint32_t timeout = MAX_TIMEOUT_LOOPS;
leighton_corr 0:01674c0ff0b0 152
leighton_corr 0:01674c0ff0b0 153 if(data_length == 0)
leighton_corr 0:01674c0ff0b0 154 {
leighton_corr 0:01674c0ff0b0 155 return 1;
leighton_corr 0:01674c0ff0b0 156 }
leighton_corr 0:01674c0ff0b0 157 twi->TXD = *data++;
leighton_corr 0:01674c0ff0b0 158 twi->TASKS_STARTTX = 1;
leighton_corr 0:01674c0ff0b0 159 while(1)
leighton_corr 0:01674c0ff0b0 160 {
leighton_corr 0:01674c0ff0b0 161 while( (twi->EVENTS_TXDSENT == 0) && (--timeout) );//&& (twi->EVENTS_ERROR == 0) );
leighton_corr 0:01674c0ff0b0 162
leighton_corr 0:01674c0ff0b0 163 if( 0 == timeout )//|| twi->EVENTS_ERROR != 0)
leighton_corr 0:01674c0ff0b0 164 {
leighton_corr 0:01674c0ff0b0 165 twi->EVENTS_ERROR = 0;
leighton_corr 0:01674c0ff0b0 166 twi->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
leighton_corr 0:01674c0ff0b0 167 twi->POWER = 0;
leighton_corr 0:01674c0ff0b0 168 TWI_DELAY(5);
leighton_corr 0:01674c0ff0b0 169 twi->POWER = 1;
leighton_corr 0:01674c0ff0b0 170 twi->ENABLE = TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos;
leighton_corr 0:01674c0ff0b0 171
leighton_corr 0:01674c0ff0b0 172 twi_master_init();
leighton_corr 0:01674c0ff0b0 173 return 1;
leighton_corr 0:01674c0ff0b0 174 }
leighton_corr 0:01674c0ff0b0 175 twi->EVENTS_TXDSENT = 0;
leighton_corr 0:01674c0ff0b0 176 if( --data_length == 0)
leighton_corr 0:01674c0ff0b0 177 {
leighton_corr 0:01674c0ff0b0 178 break;
leighton_corr 0:01674c0ff0b0 179 }
leighton_corr 0:01674c0ff0b0 180
leighton_corr 0:01674c0ff0b0 181 twi->TXD = *data++;
leighton_corr 0:01674c0ff0b0 182 }
leighton_corr 0:01674c0ff0b0 183 if(issue_stop_condition)
leighton_corr 0:01674c0ff0b0 184 {
leighton_corr 0:01674c0ff0b0 185 twi->EVENTS_STOPPED = 0;
leighton_corr 0:01674c0ff0b0 186 twi->TASKS_STOP = 1;
leighton_corr 0:01674c0ff0b0 187 while(twi->EVENTS_STOPPED == 0)
leighton_corr 0:01674c0ff0b0 188 {
leighton_corr 0:01674c0ff0b0 189 //do nothing, wait for stop sequence is sent
leighton_corr 0:01674c0ff0b0 190 }
leighton_corr 0:01674c0ff0b0 191 }
leighton_corr 0:01674c0ff0b0 192 return 0;
leighton_corr 0:01674c0ff0b0 193 }
leighton_corr 0:01674c0ff0b0 194 /**********************************************************************
leighton_corr 0:01674c0ff0b0 195 name :
leighton_corr 0:01674c0ff0b0 196 function : return: 0--SUCCESS, 1--FAIL
leighton_corr 0:01674c0ff0b0 197 **********************************************************************/
leighton_corr 0:01674c0ff0b0 198 uint8_t TwoWire::twi_master_read(uint8_t *data, uint8_t data_length, uint8_t issue_stop_condition)
leighton_corr 0:01674c0ff0b0 199 {
leighton_corr 0:01674c0ff0b0 200 uint8_t softdevice_enabled;
leighton_corr 0:01674c0ff0b0 201 uint32_t timeout = MAX_TIMEOUT_LOOPS;// err_code = NRF_SUCCESS;
leighton_corr 0:01674c0ff0b0 202
leighton_corr 0:01674c0ff0b0 203 sd_softdevice_is_enabled(&softdevice_enabled);
leighton_corr 0:01674c0ff0b0 204 //APP_ERROR_CHECK(err_code);
leighton_corr 0:01674c0ff0b0 205 if( 0 == data_length )
leighton_corr 0:01674c0ff0b0 206 {
leighton_corr 0:01674c0ff0b0 207 return 1;
leighton_corr 0:01674c0ff0b0 208 }
leighton_corr 0:01674c0ff0b0 209 else if( 1== data_length )//&& issue_stop_condition == 1)
leighton_corr 0:01674c0ff0b0 210 {
leighton_corr 0:01674c0ff0b0 211 if (softdevice_enabled == 0)
leighton_corr 0:01674c0ff0b0 212 {
leighton_corr 0:01674c0ff0b0 213 NRF_PPI->CH[7].EEP = (uint32_t)&twi->EVENTS_BB;
leighton_corr 0:01674c0ff0b0 214 NRF_PPI->CH[7].TEP = (uint32_t)&twi->TASKS_STOP;
leighton_corr 0:01674c0ff0b0 215 NRF_PPI->CHEN |= (1 << 7);
leighton_corr 0:01674c0ff0b0 216 }
leighton_corr 0:01674c0ff0b0 217 else
leighton_corr 0:01674c0ff0b0 218 {
leighton_corr 0:01674c0ff0b0 219 sd_ppi_channel_assign(7, &twi->EVENTS_BB, &twi->TASKS_STOP);
leighton_corr 0:01674c0ff0b0 220 //APP_ERROR_CHECK(err_code);
leighton_corr 0:01674c0ff0b0 221 sd_ppi_channel_enable_set(1 << 7);
leighton_corr 0:01674c0ff0b0 222 //APP_ERROR_CHECK(err_code);
leighton_corr 0:01674c0ff0b0 223 }
leighton_corr 0:01674c0ff0b0 224 }
leighton_corr 0:01674c0ff0b0 225 else
leighton_corr 0:01674c0ff0b0 226 {
leighton_corr 0:01674c0ff0b0 227 if (softdevice_enabled == 0)
leighton_corr 0:01674c0ff0b0 228 {
leighton_corr 0:01674c0ff0b0 229 NRF_PPI->CH[7].EEP = (uint32_t)&twi->EVENTS_BB;
leighton_corr 0:01674c0ff0b0 230 NRF_PPI->CH[7].TEP = (uint32_t)&twi->TASKS_SUSPEND;
leighton_corr 0:01674c0ff0b0 231 NRF_PPI->CHEN |= (1 << 7);
leighton_corr 0:01674c0ff0b0 232 }
leighton_corr 0:01674c0ff0b0 233 else
leighton_corr 0:01674c0ff0b0 234 {
leighton_corr 0:01674c0ff0b0 235 sd_ppi_channel_assign(7, &twi->EVENTS_BB, &twi->TASKS_SUSPEND);
leighton_corr 0:01674c0ff0b0 236 //APP_ERROR_CHECK(err_code);
leighton_corr 0:01674c0ff0b0 237 sd_ppi_channel_enable_set(1 << 7);
leighton_corr 0:01674c0ff0b0 238 //APP_ERROR_CHECK(err_code);
leighton_corr 0:01674c0ff0b0 239 }
leighton_corr 0:01674c0ff0b0 240 }
leighton_corr 0:01674c0ff0b0 241
leighton_corr 0:01674c0ff0b0 242 twi->EVENTS_RXDREADY = 0;
leighton_corr 0:01674c0ff0b0 243 twi->TASKS_STARTRX = 1;
leighton_corr 0:01674c0ff0b0 244
leighton_corr 0:01674c0ff0b0 245 while(1)
leighton_corr 0:01674c0ff0b0 246 {
leighton_corr 0:01674c0ff0b0 247 while( twi->EVENTS_RXDREADY == 0 && (--timeout) )
leighton_corr 0:01674c0ff0b0 248 {
leighton_corr 0:01674c0ff0b0 249 //do nothing, just wait
leighton_corr 0:01674c0ff0b0 250 }
leighton_corr 0:01674c0ff0b0 251
leighton_corr 0:01674c0ff0b0 252 if( timeout == 0 )
leighton_corr 0:01674c0ff0b0 253 {
leighton_corr 0:01674c0ff0b0 254 twi->EVENTS_ERROR = 0;
leighton_corr 0:01674c0ff0b0 255 twi->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
leighton_corr 0:01674c0ff0b0 256 twi->POWER = 0;
leighton_corr 0:01674c0ff0b0 257 TWI_DELAY(5);
leighton_corr 0:01674c0ff0b0 258 twi->POWER = 1;
leighton_corr 0:01674c0ff0b0 259 twi->ENABLE = TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos;
leighton_corr 0:01674c0ff0b0 260
leighton_corr 0:01674c0ff0b0 261 twi_master_init();
leighton_corr 0:01674c0ff0b0 262
leighton_corr 0:01674c0ff0b0 263 return 1;
leighton_corr 0:01674c0ff0b0 264 }
leighton_corr 0:01674c0ff0b0 265
leighton_corr 0:01674c0ff0b0 266 twi->EVENTS_RXDREADY = 0;
leighton_corr 0:01674c0ff0b0 267 *data++ = twi->RXD;
leighton_corr 0:01674c0ff0b0 268
leighton_corr 0:01674c0ff0b0 269 if( --data_length == 1 )
leighton_corr 0:01674c0ff0b0 270 {
leighton_corr 0:01674c0ff0b0 271 if (softdevice_enabled == 0)
leighton_corr 0:01674c0ff0b0 272 {
leighton_corr 0:01674c0ff0b0 273 //NRF_PPI->CH[7].EEP = (uint32_t)&twi->EVENTS_BB;
leighton_corr 0:01674c0ff0b0 274 NRF_PPI->CH[7].TEP = (uint32_t)&twi->TASKS_STOP;
leighton_corr 0:01674c0ff0b0 275 }
leighton_corr 0:01674c0ff0b0 276 else
leighton_corr 0:01674c0ff0b0 277 {
leighton_corr 0:01674c0ff0b0 278 sd_ppi_channel_assign(7, &twi->EVENTS_BB, &twi->TASKS_STOP);
leighton_corr 0:01674c0ff0b0 279 //APP_ERROR_CHECK(err_code);
leighton_corr 0:01674c0ff0b0 280 }
leighton_corr 0:01674c0ff0b0 281 }
leighton_corr 0:01674c0ff0b0 282
leighton_corr 0:01674c0ff0b0 283 if( data_length == 0 )
leighton_corr 0:01674c0ff0b0 284 {
leighton_corr 0:01674c0ff0b0 285 twi->TASKS_STOP = 1;
leighton_corr 0:01674c0ff0b0 286 break;
leighton_corr 0:01674c0ff0b0 287 }
leighton_corr 0:01674c0ff0b0 288 TWI_DELAY(20);
leighton_corr 0:01674c0ff0b0 289 twi->TASKS_RESUME = 1;
leighton_corr 0:01674c0ff0b0 290 }
leighton_corr 0:01674c0ff0b0 291 while( twi->EVENTS_STOPPED == 0 )
leighton_corr 0:01674c0ff0b0 292 {
leighton_corr 0:01674c0ff0b0 293 //do nothing
leighton_corr 0:01674c0ff0b0 294 }
leighton_corr 0:01674c0ff0b0 295
leighton_corr 0:01674c0ff0b0 296 twi->EVENTS_STOPPED = 0;
leighton_corr 0:01674c0ff0b0 297
leighton_corr 0:01674c0ff0b0 298 if (softdevice_enabled == 0)
leighton_corr 0:01674c0ff0b0 299 {
leighton_corr 0:01674c0ff0b0 300 NRF_PPI->CHEN &= ~(1 << 7);
leighton_corr 0:01674c0ff0b0 301 }
leighton_corr 0:01674c0ff0b0 302 else
leighton_corr 0:01674c0ff0b0 303 {
leighton_corr 0:01674c0ff0b0 304 sd_ppi_channel_enable_clr( 1 << 7 );
leighton_corr 0:01674c0ff0b0 305 //APP_ERROR_CHECK(err_code);
leighton_corr 0:01674c0ff0b0 306 }
leighton_corr 0:01674c0ff0b0 307 return 0;
leighton_corr 0:01674c0ff0b0 308 }
leighton_corr 0:01674c0ff0b0 309
leighton_corr 0:01674c0ff0b0 310 /**********************************************************************
leighton_corr 0:01674c0ff0b0 311 name :
leighton_corr 0:01674c0ff0b0 312 function :
leighton_corr 0:01674c0ff0b0 313 **********************************************************************/
leighton_corr 0:01674c0ff0b0 314 TwoWire::TwoWire(NRF_TWI_Type *twi_use)
leighton_corr 0:01674c0ff0b0 315 {
leighton_corr 0:01674c0ff0b0 316 twi = twi_use;
leighton_corr 0:01674c0ff0b0 317
leighton_corr 0:01674c0ff0b0 318 RX_BufferIndex = 0;
leighton_corr 0:01674c0ff0b0 319 RX_BufferLength = 0;
leighton_corr 0:01674c0ff0b0 320 TX_BufferIndex = 0;
leighton_corr 0:01674c0ff0b0 321 TX_BufferLength = 0;
leighton_corr 0:01674c0ff0b0 322
leighton_corr 0:01674c0ff0b0 323 Transform_Addr = 0;
leighton_corr 0:01674c0ff0b0 324
leighton_corr 0:01674c0ff0b0 325 twi_status = UNINITIALIZED;
leighton_corr 0:01674c0ff0b0 326 }
leighton_corr 0:01674c0ff0b0 327 /**********************************************************************
leighton_corr 0:01674c0ff0b0 328 name :
leighton_corr 0:01674c0ff0b0 329 function :
leighton_corr 0:01674c0ff0b0 330 **********************************************************************/
leighton_corr 0:01674c0ff0b0 331 void TwoWire::begin(uint32_t scl, uint32_t sda, uint8_t speed)
leighton_corr 0:01674c0ff0b0 332 {
leighton_corr 0:01674c0ff0b0 333 if( speed == 2 )
leighton_corr 0:01674c0ff0b0 334 {
leighton_corr 0:01674c0ff0b0 335 twi_frequency = TWI_FREQUENCY_FREQUENCY_K400;
leighton_corr 0:01674c0ff0b0 336 }
leighton_corr 0:01674c0ff0b0 337 else if( speed == 1 )
leighton_corr 0:01674c0ff0b0 338 {
leighton_corr 0:01674c0ff0b0 339 twi_frequency = TWI_FREQUENCY_FREQUENCY_K250;
leighton_corr 0:01674c0ff0b0 340 }
leighton_corr 0:01674c0ff0b0 341 else
leighton_corr 0:01674c0ff0b0 342 {
leighton_corr 0:01674c0ff0b0 343 twi_frequency = TWI_FREQUENCY_FREQUENCY_K100;
leighton_corr 0:01674c0ff0b0 344 }
leighton_corr 0:01674c0ff0b0 345
leighton_corr 0:01674c0ff0b0 346 SCL_Pin = scl;
leighton_corr 0:01674c0ff0b0 347 SDA_Pin = sda;
leighton_corr 0:01674c0ff0b0 348 twi_master_init();
leighton_corr 0:01674c0ff0b0 349
leighton_corr 0:01674c0ff0b0 350 twi_status = MASTER_IDLE;
leighton_corr 0:01674c0ff0b0 351 }
leighton_corr 0:01674c0ff0b0 352 /**********************************************************************
leighton_corr 0:01674c0ff0b0 353 name :
leighton_corr 0:01674c0ff0b0 354 function :
leighton_corr 0:01674c0ff0b0 355 **********************************************************************/
leighton_corr 0:01674c0ff0b0 356 void TwoWire::begin()
leighton_corr 0:01674c0ff0b0 357 {
leighton_corr 0:01674c0ff0b0 358 begin(TWI_SCL, TWI_SDA, 0);
leighton_corr 0:01674c0ff0b0 359 }
leighton_corr 0:01674c0ff0b0 360 /**********************************************************************
leighton_corr 0:01674c0ff0b0 361 name :
leighton_corr 0:01674c0ff0b0 362 function :
leighton_corr 0:01674c0ff0b0 363 **********************************************************************/
leighton_corr 0:01674c0ff0b0 364 void TwoWire::beginTransmission( uint8_t address )
leighton_corr 0:01674c0ff0b0 365 {
leighton_corr 0:01674c0ff0b0 366 Transform_Addr = address;
leighton_corr 0:01674c0ff0b0 367 TX_BufferIndex = 0;
leighton_corr 0:01674c0ff0b0 368 twi_status = MASTER_SEND;
leighton_corr 0:01674c0ff0b0 369 }
leighton_corr 0:01674c0ff0b0 370 /**********************************************************************
leighton_corr 0:01674c0ff0b0 371 name :
leighton_corr 0:01674c0ff0b0 372 function :
leighton_corr 0:01674c0ff0b0 373 **********************************************************************/
leighton_corr 0:01674c0ff0b0 374 void TwoWire::beginTransmission( int address )
leighton_corr 0:01674c0ff0b0 375 {
leighton_corr 0:01674c0ff0b0 376 beginTransmission( (uint8_t)address );
leighton_corr 0:01674c0ff0b0 377 }
leighton_corr 0:01674c0ff0b0 378 /**********************************************************************
leighton_corr 0:01674c0ff0b0 379 name :
leighton_corr 0:01674c0ff0b0 380 function : return: 0--SUCCESS, 1--FAIL
leighton_corr 0:01674c0ff0b0 381 **********************************************************************/
leighton_corr 0:01674c0ff0b0 382 uint8_t TwoWire::endTransmission( uint8_t stop)
leighton_corr 0:01674c0ff0b0 383 {
leighton_corr 0:01674c0ff0b0 384 uint8_t twi_flag = 1;
leighton_corr 0:01674c0ff0b0 385
leighton_corr 0:01674c0ff0b0 386 if(TX_BufferLength > 0 && !(twi_master_clear_bus()) )
leighton_corr 0:01674c0ff0b0 387 {
leighton_corr 0:01674c0ff0b0 388 twi->ADDRESS = ( Transform_Addr >> 1);
leighton_corr 0:01674c0ff0b0 389 twi_flag = twi_master_write(TX_Buffer, TX_BufferLength, stop);
leighton_corr 0:01674c0ff0b0 390 }
leighton_corr 0:01674c0ff0b0 391
leighton_corr 0:01674c0ff0b0 392 TX_BufferLength = 0;
leighton_corr 0:01674c0ff0b0 393 twi_status = MASTER_IDLE;
leighton_corr 0:01674c0ff0b0 394
leighton_corr 0:01674c0ff0b0 395 return twi_flag;
leighton_corr 0:01674c0ff0b0 396 }
leighton_corr 0:01674c0ff0b0 397 /**********************************************************************
leighton_corr 0:01674c0ff0b0 398 name :
leighton_corr 0:01674c0ff0b0 399 function : return: 0--SUCCESS, 1--FAIL
leighton_corr 0:01674c0ff0b0 400 **********************************************************************/
leighton_corr 0:01674c0ff0b0 401 uint8_t TwoWire::endTransmission(void)
leighton_corr 0:01674c0ff0b0 402 {
leighton_corr 0:01674c0ff0b0 403 uint8_t twi_flag;
leighton_corr 0:01674c0ff0b0 404
leighton_corr 0:01674c0ff0b0 405 twi_flag = endTransmission(1);
leighton_corr 0:01674c0ff0b0 406
leighton_corr 0:01674c0ff0b0 407 return twi_flag;
leighton_corr 0:01674c0ff0b0 408 }
leighton_corr 0:01674c0ff0b0 409 /**********************************************************************
leighton_corr 0:01674c0ff0b0 410 name :
leighton_corr 0:01674c0ff0b0 411 function : return: 0--SUCCESS, -1--FAIL,
leighton_corr 0:01674c0ff0b0 412 **********************************************************************/
leighton_corr 0:01674c0ff0b0 413 int TwoWire::write(uint8_t data)
leighton_corr 0:01674c0ff0b0 414 {
leighton_corr 0:01674c0ff0b0 415 if(twi_status == MASTER_SEND)
leighton_corr 0:01674c0ff0b0 416 {
leighton_corr 0:01674c0ff0b0 417 if(TX_BufferLength >= BUFF_MAX_LENGTH)
leighton_corr 0:01674c0ff0b0 418 {
leighton_corr 0:01674c0ff0b0 419 return -1;
leighton_corr 0:01674c0ff0b0 420 }
leighton_corr 0:01674c0ff0b0 421 TX_Buffer[TX_BufferLength++] = data;
leighton_corr 0:01674c0ff0b0 422 return 0;
leighton_corr 0:01674c0ff0b0 423 }
leighton_corr 0:01674c0ff0b0 424 else
leighton_corr 0:01674c0ff0b0 425 {
leighton_corr 0:01674c0ff0b0 426 return -1;
leighton_corr 0:01674c0ff0b0 427 }
leighton_corr 0:01674c0ff0b0 428 }
leighton_corr 0:01674c0ff0b0 429 /**********************************************************************
leighton_corr 0:01674c0ff0b0 430 name :
leighton_corr 0:01674c0ff0b0 431 function : return: -1--FAIL, else--the length of data stored
leighton_corr 0:01674c0ff0b0 432 **********************************************************************/
leighton_corr 0:01674c0ff0b0 433 int TwoWire::write(const uint8_t *data, size_t quantity )
leighton_corr 0:01674c0ff0b0 434 {
leighton_corr 0:01674c0ff0b0 435 if( twi_status == MASTER_SEND )
leighton_corr 0:01674c0ff0b0 436 {
leighton_corr 0:01674c0ff0b0 437 for( size_t i=0; i<quantity; ++i )
leighton_corr 0:01674c0ff0b0 438 {
leighton_corr 0:01674c0ff0b0 439 if(TX_BufferLength >= BUFF_MAX_LENGTH)
leighton_corr 0:01674c0ff0b0 440 {
leighton_corr 0:01674c0ff0b0 441 return i;
leighton_corr 0:01674c0ff0b0 442 }
leighton_corr 0:01674c0ff0b0 443 TX_Buffer[TX_BufferLength++] = data[i];
leighton_corr 0:01674c0ff0b0 444 }
leighton_corr 0:01674c0ff0b0 445 }
leighton_corr 0:01674c0ff0b0 446 else
leighton_corr 0:01674c0ff0b0 447 {
leighton_corr 0:01674c0ff0b0 448 return -1;
leighton_corr 0:01674c0ff0b0 449 }
leighton_corr 0:01674c0ff0b0 450
leighton_corr 0:01674c0ff0b0 451 return quantity;
leighton_corr 0:01674c0ff0b0 452 }
leighton_corr 0:01674c0ff0b0 453 /**********************************************************************
leighton_corr 0:01674c0ff0b0 454 name :
leighton_corr 0:01674c0ff0b0 455 function : return: 0--SUCCESS, 1--FAIL
leighton_corr 0:01674c0ff0b0 456 **********************************************************************/
leighton_corr 0:01674c0ff0b0 457 uint8_t TwoWire::requestFrom(uint8_t addr, uint8_t quantity, uint8_t stop)
leighton_corr 0:01674c0ff0b0 458 {
leighton_corr 0:01674c0ff0b0 459 uint8_t twi_flag = 1;
leighton_corr 0:01674c0ff0b0 460
leighton_corr 0:01674c0ff0b0 461 if(quantity > BUFF_MAX_LENGTH)
leighton_corr 0:01674c0ff0b0 462 {
leighton_corr 0:01674c0ff0b0 463 quantity = BUFF_MAX_LENGTH;
leighton_corr 0:01674c0ff0b0 464 }
leighton_corr 0:01674c0ff0b0 465 if(quantity > 0 && !(twi_master_clear_bus()) )
leighton_corr 0:01674c0ff0b0 466 {
leighton_corr 0:01674c0ff0b0 467 twi->ADDRESS = ( addr >> 1 );
leighton_corr 0:01674c0ff0b0 468 twi_flag = twi_master_read(RX_Buffer, quantity, stop);
leighton_corr 0:01674c0ff0b0 469 }
leighton_corr 0:01674c0ff0b0 470 RX_BufferIndex = 0;
leighton_corr 0:01674c0ff0b0 471 RX_BufferLength = quantity;
leighton_corr 0:01674c0ff0b0 472
leighton_corr 0:01674c0ff0b0 473 return twi_flag;
leighton_corr 0:01674c0ff0b0 474 }
leighton_corr 0:01674c0ff0b0 475 /**********************************************************************
leighton_corr 0:01674c0ff0b0 476 name :
leighton_corr 0:01674c0ff0b0 477 function :
leighton_corr 0:01674c0ff0b0 478 **********************************************************************/
leighton_corr 0:01674c0ff0b0 479 uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity)
leighton_corr 0:01674c0ff0b0 480 {
leighton_corr 0:01674c0ff0b0 481 return requestFrom((uint8_t) address, (uint8_t) quantity, (uint8_t) true);
leighton_corr 0:01674c0ff0b0 482 }
leighton_corr 0:01674c0ff0b0 483 /**********************************************************************
leighton_corr 0:01674c0ff0b0 484 name :
leighton_corr 0:01674c0ff0b0 485 function :
leighton_corr 0:01674c0ff0b0 486 **********************************************************************/
leighton_corr 0:01674c0ff0b0 487 uint8_t TwoWire::requestFrom(int address, int quantity)
leighton_corr 0:01674c0ff0b0 488 {
leighton_corr 0:01674c0ff0b0 489 return requestFrom((uint8_t) address, (uint8_t) quantity, (uint8_t) true);
leighton_corr 0:01674c0ff0b0 490 }
leighton_corr 0:01674c0ff0b0 491 /**********************************************************************
leighton_corr 0:01674c0ff0b0 492 name :
leighton_corr 0:01674c0ff0b0 493 function :
leighton_corr 0:01674c0ff0b0 494 **********************************************************************/
leighton_corr 0:01674c0ff0b0 495 uint8_t TwoWire::requestFrom(int address, int quantity, int sendStop)
leighton_corr 0:01674c0ff0b0 496 {
leighton_corr 0:01674c0ff0b0 497 return requestFrom((uint8_t) address, (uint8_t) quantity, (uint8_t) sendStop);
leighton_corr 0:01674c0ff0b0 498 }
leighton_corr 0:01674c0ff0b0 499 /**********************************************************************
leighton_corr 0:01674c0ff0b0 500 name :
leighton_corr 0:01674c0ff0b0 501 function : return:-1--FAIL, else:the length of data that could be read
leighton_corr 0:01674c0ff0b0 502 **********************************************************************/
leighton_corr 0:01674c0ff0b0 503 int TwoWire::available(void)
leighton_corr 0:01674c0ff0b0 504 {
leighton_corr 0:01674c0ff0b0 505 if(RX_BufferIndex <= RX_BufferLength)
leighton_corr 0:01674c0ff0b0 506 {
leighton_corr 0:01674c0ff0b0 507 return (RX_BufferLength - RX_BufferIndex);
leighton_corr 0:01674c0ff0b0 508 }
leighton_corr 0:01674c0ff0b0 509 else
leighton_corr 0:01674c0ff0b0 510 {
leighton_corr 0:01674c0ff0b0 511 return -1;
leighton_corr 0:01674c0ff0b0 512 }
leighton_corr 0:01674c0ff0b0 513 }
leighton_corr 0:01674c0ff0b0 514 /**********************************************************************
leighton_corr 0:01674c0ff0b0 515 name :
leighton_corr 0:01674c0ff0b0 516 function :
leighton_corr 0:01674c0ff0b0 517 **********************************************************************/
leighton_corr 0:01674c0ff0b0 518 int TwoWire::read(void)
leighton_corr 0:01674c0ff0b0 519 {
leighton_corr 0:01674c0ff0b0 520 if(RX_BufferIndex < RX_BufferLength)
leighton_corr 0:01674c0ff0b0 521 {
leighton_corr 0:01674c0ff0b0 522 return RX_Buffer[RX_BufferIndex++];
leighton_corr 0:01674c0ff0b0 523 }
leighton_corr 0:01674c0ff0b0 524 else
leighton_corr 0:01674c0ff0b0 525 {
leighton_corr 0:01674c0ff0b0 526 return -1;
leighton_corr 0:01674c0ff0b0 527 }
leighton_corr 0:01674c0ff0b0 528 }
leighton_corr 0:01674c0ff0b0 529
leighton_corr 0:01674c0ff0b0 530
leighton_corr 0:01674c0ff0b0 531
leighton_corr 0:01674c0ff0b0 532
leighton_corr 0:01674c0ff0b0 533
leighton_corr 0:01674c0ff0b0 534
leighton_corr 0:01674c0ff0b0 535