DSPWriter.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #pragma once
  2. #include <stdint.h>
  3. #define CORE_REGISTER_R0_REGSIZE 2
  4. #define HARDWARE_CONF_REGSIZE 1
  5. #define CORE_REGISTER_R4_REGSIZE 2
  6. #define PARAMETER_REGSIZE 4
  7. #define PROGRAM_REGSIZE 5
  8. /* 7-bit i2c addresses */
  9. #define DSP_I2C_ADDRESS 0x34 //(0x68 >> 1) & 0xFE
  10. #define EEPROM_I2C_ADDRESS 0x50 //(0xa0 >> 1) & 0xFE
  11. // ADAU1401 address space boundaries
  12. #define DSP_PARAM_RAM_START 0x0000
  13. #define DSP_PARAM_RAM_END 0x03FF
  14. #define DSP_PROG_RAM_START 0x0400
  15. #define DSP_PROG_RAM_END 0x07FF
  16. // Hardware register constants
  17. typedef enum
  18. {
  19. InterfaceRegister0 = 0x0800,
  20. InterfaceRegister1 = 0x0801,
  21. InterfaceRegister2 = 0x0802,
  22. InterfaceRegister3 = 0x0803,
  23. InterfaceRegister4 = 0x0804,
  24. InterfaceRegister5 = 0x0805,
  25. InterfaceRegister6 = 0x0806,
  26. InterfaceRegister7 = 0x0807,
  27. GpioAllRegister = 0x0808,
  28. Adc0 = 0x0809,
  29. Adc1 = 0x080A,
  30. Adc2 = 0x080B,
  31. Adc3 = 0x080C,
  32. SafeloadData0 = 0x0810,
  33. SafeloadData1 = 0x0811,
  34. SafeloadData2 = 0x0812,
  35. SafeloadData3 = 0x0813,
  36. SafeloadData4 = 0x0814,
  37. SafeloadAddress0 = 0x0815,
  38. SafeloadAddress1 = 0x0816,
  39. SafeloadAddress2 = 0x0817,
  40. SafeloadAddress3 = 0x0818,
  41. SafeloadAddress4 = 0x0819,
  42. DataCapture0 = 0x081A,
  43. DataCpature1 = 0x081B,
  44. CoreRegister = 0x081C,
  45. RAMRegister = 0x081D,
  46. SerialOutRegister1 = 0x081E,
  47. SerialInputRegister = 0x081F,
  48. MpCfg0 = 0x0820,
  49. MpCfg1 = 0x0821,
  50. AnalogPowerDownRegister = 0x0822,
  51. AnalogInterfaceRegister0 = 0x0824
  52. } dspRegister;
  53. class DSPWriter
  54. {
  55. public:
  56. DSPWriter();
  57. ~DSPWriter();
  58. // DSP data write methods
  59. static void downloadProgram();
  60. /***************************************
  61. Function: writeRegisterBlock()
  62. Inputs:
  63. uint16_t subAddress; DSP memory start address
  64. int dataLength; Number of bytes to write
  65. const uint8_t *pdata; Data array to write
  66. uint8_t registerSize; Number of bytes each register can hold
  67. ***************************************/
  68. static bool writeRegisterBlock(uint16_t subAddress, int dataLength, const uint8_t* pdata, uint8_t registerSize);
  69. /***************************************
  70. Function: writeRegister()
  71. Purpose: Writes data to the DSP
  72. (max 32 bytes due to i2c buffer size)
  73. Inputs: uint16_t startMemoryAddress; DSP memory address
  74. uint8_t length; Number of bytes to write
  75. uint8_t *data; Data array to write
  76. Returns: None
  77. ***************************************/
  78. static void writeRegister(uint16_t memoryAddress, uint8_t length, const uint8_t* data);
  79. /***************************************
  80. Function: resetSafeload()
  81. Purpose: Flushes any pending safeload slots by triggering IST (if the
  82. counter is non-zero), then resets the counter to zero. Call at
  83. both session start and session end to keep the DSP's internal
  84. safeload counter in sync with ours.
  85. ***************************************/
  86. static void resetSafeload();
  87. // Template wrapper for safeload_write
  88. template <typename Address, typename Data1, typename... DataN>
  89. void safeload_write(const Address& address, const Data1& data1, const DataN &...dataN)
  90. {
  91. // Store passed address
  92. _dspRegAddr = address;
  93. safeload_write_wrapper(data1, dataN...);
  94. }
  95. /***************************************
  96. Function: safeload_writeRegister()
  97. Purpose: Writes 5 bytes of data to the parameter memory of the DSP, the first byte is 0x00
  98. Inputs: uint16_t startMemoryAddress; DSP memory address
  99. *data; Data array to write
  100. bool finished; Indicates if this is the last packet or not
  101. Returns: None
  102. ***************************************/
  103. void safeload_writeRegister(uint16_t memoryAddress, uint8_t* data, bool finished);
  104. void safeload_writeRegister(uint16_t memoryAddress, int32_t data, bool finished);
  105. void safeload_writeRegister(uint16_t memoryAddress, float data, bool finished);
  106. void safeload_writeRegister(uint16_t memoryAddress, int16_t data, bool finished);
  107. void safeload_writeRegister(uint16_t memoryAddress, uint32_t data, bool finished);
  108. void safeload_writeRegister(uint16_t memoryAddress, uint16_t data, bool finished);
  109. void safeload_writeRegister(uint16_t memoryAddress, uint8_t data, bool finished);
  110. void safeload_writeRegister(uint16_t memoryAddress, double data, bool finished);
  111. private:
  112. // Wrapper template functions for safeload template
  113. template <typename Data1, typename... DataN>
  114. void safeload_write_wrapper(const Data1& data1, const DataN &...dataN)
  115. {
  116. safeload_writeRegister(_dspRegAddr, data1, false);
  117. _dspRegAddr++;
  118. safeload_write_wrapper(dataN...); // Recursive call using pack expansion syntax
  119. }
  120. // Handles last argument
  121. template <typename Data1>
  122. void safeload_write_wrapper(const Data1& data1)
  123. {
  124. safeload_writeRegister(_dspRegAddr, data1, true);
  125. }
  126. // Private variables
  127. uint16_t _dspRegAddr; // Used by template safeload functions
  128. };