[
](LICENSE) 



ARM I2C Drivers for various components
Requires
- sarmfsw
- HARMcksL (following used components(s))
Usage
- define
I2C_$CPNT$ in a file called globals.h with the I2C instance you want it to be tied to (no neeed to declare instance in case of multiple devices)
- define
I2C_$CPNT$_NB with number of devices to enable multiple devices
- define
$CPNT$_BASE_ADDR with base device address if in the need to override default address defined in header
- use
$CPNT$_Init(idx, hi2c, devAddress) for every device with its index, proper instance and I2C address
- I2CMEM type is generic and needs 2 more parameters: storage size and write buffer size (can be set to 0 for FRAM)
- use
$CPNT$_Init_Single() once in case of single device using defaults
- I2CMEM type is generic and needs 2 parameters: storage size and write buffer size (can be set to 0 for FRAM)
- start using
$CPNT$_funcs()
Remarks
- define
VERBOSE in compiler options to printf infos from component handlers
- define
NO_WARN_I2C_DRIVERS at project level to disable possible warning messages when multiple devices declared which may have same address
- Components with a xxx_proc file can access
I2C_slave instance through CPNT->cfg.slave_inst. Please keep in mind some components are somewhat custom and needs to be accesses through CPNT->cfg.slave_inst_xxx instead if needed.
Supported devices
EEPROM / FRAM:
- I2CMEM: Any EEPROM / FRAM
- STATUS: DONE
- Use I2CMEM when compatibility between EEPROM/FRAM is needed
- Check I2CMEM_ex.h for a few components init aliases
- In case FRAM is only useful, you may use legacy FM24C or MB85RC256V components, or set buf_size to I2CMEM_WBUF_NONE at init
- Transaction timeout set to 500ms:
- There shouldn't be any timeout reached for these components, otherwise refer to MB85RC256V comment
- FM24C: 4/16-Kbit (512/2K * 8) Serial I2C F-RAM
- STATUS: DONE
- I2C_Drivers legacy FRAM component, consider switching to I2CMEM for new designs
- Use FM24C for I2C addresses banked components (with 8b internal address):
- Tested on:
- FM24C16B
- FM24C04B
- BR24T04FVM
- Transaction timeout set to 500ms:
- There shouldn't be any timeout reached for these components, otherwise refer to MB85RC256V comment
- MB85RC256V: 256-Kbit (32K * 8) I2C Memory FRAM
- STATUS: DONE
- I2C_Drivers legacy FRAM component, consider switching to I2CMEM for new designs
- Use MB85RC256V for 16b internal addresses components:
- Transaction timeout set to 500ms:
- For bigger size components, in case timeout is reached, read/write transactions may be split in multiple calls (refreshing watchdog if in use).
- Set a longer timeout by calling I2C_set_slave_timeout in init sequence is another way to address such a need
OTHER:
- ADS1115: Ultra-Small, Low-Power, 16-Bit Analog-to-Digital Converter with Internal Reference
- AMG88: Infrared Array Sensor (Grid-EYE)
- STATUS: DONE (TODO: recognition)
- APDS9930: Digital Proximity and Ambient Light Sensor
- APDS9960: Digital Proximity, Ambient Light, RGB and Gesture Sensor
- STATUS: DONE (TODO: GESTURES TO TEST/SWITCH, DISABLED YET)
- AT42QT1244: 24-key QMatrix FMEA IEC/EN/UL60730 Touch Sensor
- BMP180: Digital pressure sensor
- DRV2605L: 2 to 5.2V Haptic Driver for LRA and ERM With Effect Library and Smart-Loop Architecture
- DS-GPM.S: 99 Channel Positioning System (GPS + GLONASS) Shield
- MCP4725: 12-Bit Digital-to-Analog Converter with EEPROM Memory
- MCP9808: +/-0.5C Maximum Accuracy Digital Temperature Sensor
- MTCH6102: Low-Power Projected Capacitive Touch Controller
- NCA9595: Low-voltage 16-bit I²C and SMBus I/O expander
- PCA9532: 16-bit I2C-bus LED dimmer
- PCA9624: 8-bit Fm+ I2C-bus 100mA 40V LED driver
- PCA9685: 16-channel, 12-bit PWM Fm+ I2C-bus LED controller
- PCA9952: 16-channel Fm+ I2C-bus 57 mA constant current LED driver (compatible with PCA9955)
- PCA9956: 24-channel Fm+ I2C-bus 57 mA/20 V constant current LED driver
- PCF8523: Real-Time Clock (RTC) and calendar
- STATUS: DONE (TODO: handle clkout and alarms)
- S11059: I2C interface-compatible color sensor
- TCS3400: Color light-to-digital converter
- STATUS: DONE (TODO: auto-integration & persistence in the works)
- TCS3472: Color light-to-digital converter with IR filter
- STATUS: DONE (TODO: auto-integration & persistence in the works)
- TMP1075: Temperature Sensor With I2C and SMBus Interface in Industry Standard LM75 Form Factor and Pinout
- TSL2591: Very-high sensitivity light-to-digital converter
- STATUS: DONE (TODO: auto-integration & persistence in the works)
Multiple component type on single project (singleton components excluded)
- If multiple component type are used on the same MCU device:
- A for loop can be used passing I2C_$CPNT$ if all components are tied to the same i2C instance (physical bus)
- In case same multiple same component type are used on different physical busses, please pass each instance to $CPNT$_Init
- note: formerly, I2C_$CPNT$ was used to determine device type enabling (and its instance); as long as enabled with former I2C_$CPNT$, init function can be called using other params
Following peripherals (?)
- Capacitive (MPR121)
- OLED
- Clock Generator (SI5351 with help of etherkit)
- Accelerometer/Gyro (GY521 MPU6050 with help of jrowberg)
- ...
You may also:
- contribute with more devices using templates in subfolder
- if in doubt,
multiple template implementation is recommended
- raise issue on github to ask for particular devices
Limitations
- Compatibility with interrupt driven R/W transactions (when possible & usefull, yet already tested manually on some components)
TODO
- Any RTOS compatibility (blocking transactions doesn't match with RTOS task timings)
- (FreeRTOS) compatibility using R/W functions using interrupts with callbacks (when possible)
Misc
Feel free to share your thoughts @ xgarm.nosp@m.anbo.nosp@m.ziax@.nosp@m.gmai.nosp@m.l.com about:
- issues encountered (might also raise issue on github directly)
- optimizations
- improvements & new functionalities