An integrated code base for smart watch model using nrf51822. Used the efforts from Roger Clark, Goran Mahovlic, Nordic team SDKs and mbed repos on OLED. Programming: The watch prototype can be interfaced to Tiny Seeed BLE programmer (left of the Tiny Seeed BLE board). Connect SWDIO, SWD CLK, Vin and GND pins. For USB debugging also connect RX and TX pins. Used Roger's nice webpage to come up with the pin mapping and many other HW insights. http://www.rogerclark.net/arduino-on-the-id100hr-fitness-tracker/

Dependencies:   BLE_API SFE_MicroOLED_debugPrint mbed nRF51822

Fork of BLE_TemperatureAdvertising by xiao sun

Committer:
root@developer-sjc-indigo-compiler.local.mbed.org
Date:
Wed Dec 27 06:52:35 2017 +0000
Revision:
8:c98204f59c76
Parent:
5:8c21994db8d2
Added tag dec26 for changeset 1b0597b7ead3

Who changed what in which revision?

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