An I2C Scanner, to test that your I2C can be detected. Works with the NRF51 Development Kit.

Dependencies:   mbed-src-nrf51822

Committer:
Cannonball2134
Date:
Thu Jun 30 07:43:22 2016 +0000
Revision:
1:117c1bb3ce43
Parent:
0:839b7264c387
Working I2C Scanner on the NRF51-DK

Who changed what in which revision?

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