TempSensorSpi.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. // ----------------------------------------------------------------------------
  2. // TempSensorSpi.c -
  3. // ----------------------------------------------------------------------------
  4. // Beschreibung: Auswertung eines Temperatursensors mit
  5. // Spi-Kommunikation
  6. // HW: BMS-Master, IPE 362-02-02R0
  7. // Revision: 11. Juni 2012, neu, T. Maurer, IPE
  8. // ----------------------------------------------------------------------------
  9. #include "BMS_Master.h"
  10. DSPI_config_t TempMess_SPI_Config = {
  11. &DSPI_2,
  12. DSPI_Master,
  13. 16, //FrameSize
  14. DSPI_ClassicFormat,
  15. DSPI_Baud2MHz,
  16. 2, //CStoSCK_Delay_Cycles
  17. 1, //AfterSCK_Delay_Cycles
  18. 10,
  19. 1,
  20. CS_Cont_OFF, //enum{CS_Cont_ON, CS_Cont_OFF};
  21. DSPI2_PortC12
  22. };
  23. static volatile TempMessStatus_t TempMess_S;
  24. static const TempMessStatus_t TempMess_S_INIT = {Idle,NoTask,0,0,0,0,0};
  25. static int8_t TempMess_FSM_update(void);
  26. //-----------------------------------------------------------
  27. // API
  28. void TempMess_init()
  29. {
  30. DSPI_init(&TempMess_SPI_Config);
  31. TempMess_S = TempMess_S_INIT;
  32. }
  33. void TempMess_update()
  34. {
  35. TempMess_FSM_update();
  36. }
  37. int8_t TempMess_poll_Value(int16_t *target)
  38. {
  39. if ( ! TempMess_S.valueIsNew ) return -1;
  40. *target = TempMess_S.value;
  41. TempMess_S.valueIsNew = 0;
  42. return 0;
  43. }
  44. int8_t TempMess_triggerRead()
  45. {
  46. if (TempMess_S.FsmState != Idle) return -1;
  47. TempMess_S.TaskTrigger = Read;
  48. return 0;
  49. }
  50. //-----------------------------------------------------------
  51. // static
  52. static int8_t TempMess_pushDummys()
  53. {
  54. volatile struct DSPI_tag *p_DSPI = TempMess_SPI_Config.p_Modul;
  55. if (p_DSPI->SR.B.TXCTR != 0) return -1;
  56. if ( DSPI_push(&TempMess_SPI_Config, 0xFFFF, 1) < 0 ) return -1;
  57. return 0;
  58. }
  59. static int8_t TempMess_pop_AdcVal()
  60. {
  61. uint16_t cnt_rcvd = 0;
  62. uint16_t value_tmp;
  63. if ( DSPI_pop(&TempMess_SPI_Config, &value_tmp) < 0 ) return -1; //nothing rcvd
  64. TempMess_S.value = ((int16_t)value_tmp) >> 3; //0.0625 Grad Auflösung
  65. TempMess_S.value >>= 4; //Umrechnung in 1 Grad-Auflösung (8-Bit)
  66. return 0; //1 = finished
  67. }
  68. static int8_t TempMess_checkTimeOut(uint16_t Cnt, uint16_t TO_Value)
  69. {
  70. if (Cnt >= TO_Value) {
  71. TempMess_init();
  72. TempMess_S.Flags.B.FSM_TO = 1;
  73. return -1;
  74. }
  75. return 0;
  76. }
  77. //FSM
  78. static int8_t TempMess_FSM_update()
  79. {
  80. #define FSM_TIMEOUT 10
  81. static uint16_t StateTimeoutCnt = 0;
  82. volatile struct DSPI_tag *p_DSPI = TempMess_SPI_Config.p_Modul;
  83. StateTimeoutCnt += 1;
  84. switch (TempMess_S.FsmState) {
  85. case Idle:
  86. if (TempMess_S.TaskTrigger == Read) {
  87. DSPI_Clear_RxFifo(&TempMess_SPI_Config);
  88. if (TempMess_pushDummys() >= 0 ) {
  89. TempMess_S.TaskTrigger = NoTask;
  90. TempMess_S.FsmState = Read_1;
  91. StateTimeoutCnt = 0;
  92. }
  93. }
  94. break;
  95. case Read_1:
  96. if (TempMess_checkTimeOut(StateTimeoutCnt,FSM_TIMEOUT) < 0) return -1;
  97. if ( p_DSPI->SR.B.EOQF == 1 ) { //finished
  98. TempMess_S.FsmState = Read_2;
  99. StateTimeoutCnt = 0;
  100. }
  101. break;
  102. case Read_2:
  103. if (TempMess_checkTimeOut(StateTimeoutCnt,FSM_TIMEOUT) < 0) return -2;
  104. if (TempMess_pop_AdcVal() >=0 ) {
  105. p_DSPI->SR.B.EOQF = 1;
  106. TempMess_S.valueIsNew = 1;
  107. TempMess_S.FsmState = Idle;
  108. }
  109. break;
  110. }
  111. return 0;
  112. #undef FSM_TIMEOUT
  113. }