i2c_hal.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * This file implements Hardware Abstraction Layer (HAL) to make the I2C
  3. * communication of MSPM0 SDK compatible with ADC (MCP3426/7/8) and DAC
  4. * (MCP34728)
  5. */
  6. #include "src/interfaces/i2c_controller_interface.h"
  7. #include "ti/driverlib/dl_i2c.h"
  8. #include "ti_msp_dl_config.h"
  9. #include <stdio.h>
  10. volatile bool gRxComplete;
  11. volatile bool gTxComplete;
  12. uint8_t gTxPacket[I2C_TX_MAX_PACKET_SIZE];
  13. uint8_t gRxPacket[I2C_RX_MAX_PACKET_SIZE];
  14. uint8_t gTxADClen, gTxADCcount;
  15. uint8_t gRxADClen, gRxADCcount;
  16. /*
  17. static function is for implementing Data Hiding, access to the static function
  18. is restricted to the file where they are declared const keyword for
  19. 'TARGET_ADDRESS' and 'Data_length' makes the variable immutable. const uint8_t *
  20. const Data: means the pointer to the variable and the value of Data is immutable
  21. */
  22. I2CRxPackage controllerRxPackage;
  23. I2CTxPackage controllerTxPackage;
  24. static bool msp_i2c_write(uint8_t const TARGET_ADDRESS) {
  25. // Flush any stale data in TX FIFO:
  26. DL_I2C_flushControllerTXFIFO(I2C_controller_INST);
  27. // **Check if the I2C bus is stuck before WRITE
  28. if (DL_I2C_getControllerStatus(I2C_controller_INST) &
  29. DL_I2C_CONTROLLER_STATUS_ERROR) {
  30. printf("I2C Communication: Bus is stuck!\n");
  31. DL_I2C_resetControllerTransfer(I2C_controller_INST);
  32. return false;
  33. }
  34. // **Wait for I2C Bus to be Free**
  35. while (DL_I2C_getControllerStatus(I2C_controller_INST) &
  36. DL_I2C_CONTROLLER_STATUS_BUSY_BUS)
  37. ;
  38. // **Start I2C Write Transaction**
  39. DL_I2C_startControllerTransfer(I2C_controller_INST, TARGET_ADDRESS,
  40. DL_I2C_CONTROLLER_DIRECTION_TX, controllerTxPackage.len);
  41. // **Load Configuration Byte into TX FIFO**
  42. DL_I2C_fillControllerTXFIFO(I2C_controller_INST, controllerTxPackage.packet, controllerTxPackage.len);
  43. for (uint8_t i = 0; i < controllerTxPackage.len; i++) {
  44. printf("Sending 0x%02X\n", controllerTxPackage.packet[i]);
  45. }
  46. // ** Wait for the I2C Bus to be FREE **
  47. while (DL_I2C_getControllerStatus(I2C_controller_INST) &
  48. DL_I2C_CONTROLLER_STATUS_BUSY_BUS)
  49. ;
  50. // **Check if the target address is incorrect
  51. if (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_ADDR_ACK) {
  52. printf("I2C Write Error: Target Address not acknowledged!\n");
  53. return false;
  54. }
  55. // Debug for I2C WRITE:
  56. //printf("HAL Write: Address=0x%02X, Data Length=%d\n", TARGET_ADDRESS, Data_length);
  57. // **Check for any WRITE error
  58. if (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_ERROR) {
  59. printf("I2C Write Error: Bus error after sending data.\n");
  60. return false;
  61. }
  62. return true;
  63. }
  64. static bool msp_i2c_read(uint8_t const TARGET_ADDRESS) {
  65. // Flush any stale data in TX FIFO:
  66. DL_I2C_flushControllerRXFIFO(I2C_controller_INST);
  67. while (DL_I2C_getControllerStatus(I2C_controller_INST) &
  68. DL_I2C_CONTROLLER_STATUS_BUSY_BUS)
  69. ;
  70. DL_I2C_startControllerTransfer(I2C_controller_INST, TARGET_ADDRESS,
  71. DL_I2C_CONTROLLER_DIRECTION_RX, controllerRxPackage.len);
  72. while (DL_I2C_getControllerStatus(I2C_controller_INST) &
  73. DL_I2C_CONTROLLER_STATUS_BUSY_BUS)
  74. ;
  75. DL_I2C_enableInterrupt(I2C_controller_INST,
  76. DL_I2C_INTERRUPT_CONTROLLER_RXFIFO_TRIGGER);
  77. return true;
  78. }
  79. I2C_Interface i2c_hal = {
  80. .write = msp_i2c_write,
  81. .read = msp_i2c_read,
  82. };