2828#define I2C_SERCOM_APBCMASK PM_APBCMASK_SERCOM0
2929
3030static uint8_t txBuffer [2 ];
31- static uint8_t rxBuffer [1 ];
31+ uint8_t rxBuffer [1 ];
3232static uint8_t txBufferLen = 0 ;
3333static uint8_t rxBufferLen = 0 ;
3434static uint8_t txAddress ;
@@ -327,7 +327,7 @@ static inline bool sendDataMasterWIRE(uint8_t data)
327327 return true;
328328}
329329
330- static inline void i2c_init (uint32_t baud ) {
330+ void i2c_init (uint32_t baud ) {
331331 //Master Mode
332332 initMasterWIRE (baud );
333333 enableWIRE ();
@@ -336,7 +336,7 @@ static inline void i2c_init(uint32_t baud) {
336336 pin_set_peripheral_function (PINMUX_PA09C_SERCOM0_PAD1 );
337337}
338338
339- static inline void i2c_end () {
339+ void i2c_end () {
340340 disableWIRE ();
341341}
342342
@@ -425,219 +425,4 @@ uint8_t i2c_write(uint8_t ucData)
425425 return 1 ;
426426}
427427
428- uint8_t readRegister (uint8_t reg ) {
429- i2c_beginTransmission (PMIC_ADDRESS );
430- i2c_write (reg );
431- i2c_endTransmission (true);
432-
433- i2c_requestFrom (PMIC_ADDRESS , 1 , true);
434- return rxBuffer [0 ];
435- }
436-
437- uint8_t writeRegister (uint8_t reg , uint8_t data ) {
438- i2c_beginTransmission (PMIC_ADDRESS );
439- i2c_write (reg );
440- i2c_write (data );
441- i2c_endTransmission (true);
442-
443- return 2 ;
444- }
445-
446- bool disableWatchdog (void ) {
447-
448- uint8_t DATA = readRegister (CHARGE_TIMER_CONTROL_REGISTER );
449- writeRegister (CHARGE_TIMER_CONTROL_REGISTER , (DATA & 0b11001110 ));
450- return 1 ;
451- }
452-
453- bool setInputVoltageLimit (uint16_t voltage ) {
454-
455- uint8_t DATA = readRegister (INPUT_SOURCE_REGISTER );
456- uint8_t mask = DATA & 0b10000111 ;
457-
458- switch (voltage ) {
459-
460- case 3880 :
461- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00000000 ));
462- break ;
463-
464- case 3960 :
465- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00001000 ));
466- break ;
467-
468- case 4040 :
469- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00010000 ));
470- break ;
471-
472- case 4120 :
473- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00011000 ));
474- break ;
475-
476- case 4200 :
477- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00100000 ));
478- break ;
479-
480- case 4280 :
481- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00101000 ));
482- break ;
483-
484- case 4360 :
485- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00110000 ));
486- break ;
487-
488- case 4440 :
489- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00111000 ));
490- break ;
491-
492- case 4520 :
493- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b01000000 ));
494- break ;
495-
496- case 4600 :
497- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b01001000 ));
498- break ;
499-
500- case 4680 :
501- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b01010000 ));
502- break ;
503-
504- case 4760 :
505- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b01011000 ));
506- break ;
507-
508- case 4840 :
509- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b01100000 ));
510- break ;
511-
512- case 4920 :
513- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b01101000 ));
514- break ;
515-
516- case 5000 :
517- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b01110000 ));
518- break ;
519-
520- case 5080 :
521- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b01111000 ));
522- break ;
523-
524- default :
525- return 0 ; // return error since the value passed didn't match
526- }
527-
528- return 1 ; // value was written successfully
529- }
530-
531- bool setInputCurrentLimit (uint16_t current ) {
532-
533-
534- uint8_t DATA = readRegister (INPUT_SOURCE_REGISTER );
535- uint8_t mask = DATA & 0b11111000 ;
536-
537- switch (current ) {
538-
539- case 100 :
540- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00000000 ));
541- break ;
542-
543- case 150 :
544- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00000001 ));
545- break ;
546-
547- case 500 :
548- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00000010 ));
549- break ;
550-
551- case 900 :
552- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00000011 ));
553- break ;
554-
555- case 1200 :
556- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00000100 ));
557- break ;
558-
559- case 1500 :
560- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00000101 ));
561- break ;
562-
563- case 2000 :
564- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00000110 ));
565- break ;
566-
567- case 3000 :
568- writeRegister (INPUT_SOURCE_REGISTER , (mask | 0b00000111 ));
569- break ;
570-
571- default :
572- return 0 ; // return error since the value passed didn't match
573- }
574-
575- return 1 ; // value was written successfully
576- }
577-
578- bool setChargeCurrent (bool bit7 , bool bit6 , bool bit5 , bool bit4 , bool bit3 , bool bit2 ) {
579-
580- uint8_t current = 0 ;
581- if (bit7 ) current = current | 0b10000000 ;
582- if (bit6 ) current = current | 0b01000000 ;
583- if (bit5 ) current = current | 0b00100000 ;
584- if (bit4 ) current = current | 0b00010000 ;
585- if (bit3 ) current = current | 0b00001000 ;
586- if (bit2 ) current = current | 0b00000100 ;
587-
588- uint8_t DATA = readRegister (CHARGE_CURRENT_CONTROL_REGISTER );
589- uint8_t mask = DATA & 0b00000001 ;
590- writeRegister (CHARGE_CURRENT_CONTROL_REGISTER , current | mask );
591- return 1 ;
592- }
593-
594- bool setChargeVoltage (uint16_t voltage ) {
595-
596- uint8_t DATA = readRegister (CHARGE_VOLTAGE_CONTROL_REGISTER );
597- uint8_t mask = DATA & 0b000000011 ;
598-
599- switch (voltage ) {
600-
601- case 4112 :
602- writeRegister (CHARGE_VOLTAGE_CONTROL_REGISTER , (mask | 0b10011000 ));
603- break ;
604-
605- case 4208 :
606- writeRegister (CHARGE_VOLTAGE_CONTROL_REGISTER , (mask | 0b10110000 ));
607- break ;
608-
609- default :
610- return 0 ; // return error since the value passed didn't match
611- }
612-
613- return 1 ; // value was written successfully
614- }
615-
616- bool disableCharge ()
617- {
618- uint8_t DATA = readRegister (POWERON_CONFIG_REGISTER );
619- uint8_t mask = DATA & 0b11001111 ;
620-
621- writeRegister (POWERON_CONFIG_REGISTER , mask );
622-
623- return 1 ;
624- }
625-
626- void apply_pmic_newdefaults ()
627- {
628- disableWatchdog ();
629-
630- //disableDPDM();
631- disableCharge ();
632- setInputVoltageLimit (4360 ); // default
633- setInputCurrentLimit (900 ); // 900mA
634- setChargeCurrent (0 ,0 ,0 ,0 ,0 ,0 ); // 512mA
635- setChargeVoltage (4112 ); // 4.112V termination voltage
636- }
637-
638- void configure_pmic () {
639- i2c_init (100000 );
640- apply_pmic_newdefaults ();
641- }
642-
643- #endif
428+ #endif
0 commit comments