123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- // ----------------------------------------------------------------------------
- // TempSensorSpi.c -
- // ----------------------------------------------------------------------------
- // Beschreibung: Auswertung eines Temperatursensors mit
- // Spi-Kommunikation
- // HW: BMS-Master, IPE 362-02-02R0
- // Revision: 11. Juni 2012, neu, T. Maurer, IPE
- // ----------------------------------------------------------------------------
- #include "BMS_Master.h"
- DSPI_config_t TempMess_SPI_Config = {
- &DSPI_2,
- DSPI_Master,
- 16, //FrameSize
- DSPI_ClassicFormat,
- DSPI_Baud2MHz,
- 2, //CStoSCK_Delay_Cycles
- 1, //AfterSCK_Delay_Cycles
- 10,
- 1,
- CS_Cont_OFF, //enum{CS_Cont_ON, CS_Cont_OFF};
- DSPI2_PortC12
- };
- static volatile TempMessStatus_t TempMess_S;
- static const TempMessStatus_t TempMess_S_INIT = {Idle,NoTask,0,0,0,0,0};
- static int8_t TempMess_FSM_update(void);
- //-----------------------------------------------------------
- // API
- void TempMess_init()
- {
- DSPI_init(&TempMess_SPI_Config);
-
- TempMess_S = TempMess_S_INIT;
- }
- void TempMess_update()
- {
- TempMess_FSM_update();
- }
- int8_t TempMess_poll_Value(int16_t *target)
- {
- if ( ! TempMess_S.valueIsNew ) return -1;
- *target = TempMess_S.value;
- TempMess_S.valueIsNew = 0;
- return 0;
- }
- int8_t TempMess_triggerRead()
- {
- if (TempMess_S.FsmState != Idle) return -1;
- TempMess_S.TaskTrigger = Read;
- return 0;
- }
- //-----------------------------------------------------------
- // static
- static int8_t TempMess_pushDummys()
- {
- volatile struct DSPI_tag *p_DSPI = TempMess_SPI_Config.p_Modul;
- if (p_DSPI->SR.B.TXCTR != 0) return -1;
- if ( DSPI_push(&TempMess_SPI_Config, 0xFFFF, 1) < 0 ) return -1;
- return 0;
- }
- static int8_t TempMess_pop_AdcVal()
- {
- uint16_t cnt_rcvd = 0;
- uint16_t value_tmp;
- if ( DSPI_pop(&TempMess_SPI_Config, &value_tmp) < 0 ) return -1; //nothing rcvd
- TempMess_S.value = ((int16_t)value_tmp) >> 3; //0.0625 Grad Auflösung
- TempMess_S.value >>= 4; //Umrechnung in 1 Grad-Auflösung (8-Bit)
- return 0; //1 = finished
- }
- static int8_t TempMess_checkTimeOut(uint16_t Cnt, uint16_t TO_Value)
- {
- if (Cnt >= TO_Value) {
- TempMess_init();
- TempMess_S.Flags.B.FSM_TO = 1;
- return -1;
- }
- return 0;
- }
- //FSM
- static int8_t TempMess_FSM_update()
- {
- #define FSM_TIMEOUT 10
- static uint16_t StateTimeoutCnt = 0;
- volatile struct DSPI_tag *p_DSPI = TempMess_SPI_Config.p_Modul;
- StateTimeoutCnt += 1;
- switch (TempMess_S.FsmState) {
- case Idle:
- if (TempMess_S.TaskTrigger == Read) {
- DSPI_Clear_RxFifo(&TempMess_SPI_Config);
- if (TempMess_pushDummys() >= 0 ) {
- TempMess_S.TaskTrigger = NoTask;
- TempMess_S.FsmState = Read_1;
- StateTimeoutCnt = 0;
- }
- }
- break;
- case Read_1:
- if (TempMess_checkTimeOut(StateTimeoutCnt,FSM_TIMEOUT) < 0) return -1;
- if ( p_DSPI->SR.B.EOQF == 1 ) { //finished
- TempMess_S.FsmState = Read_2;
- StateTimeoutCnt = 0;
- }
- break;
- case Read_2:
- if (TempMess_checkTimeOut(StateTimeoutCnt,FSM_TIMEOUT) < 0) return -2;
- if (TempMess_pop_AdcVal() >=0 ) {
- p_DSPI->SR.B.EOQF = 1;
- TempMess_S.valueIsNew = 1;
- TempMess_S.FsmState = Idle;
- }
- break;
- }
- return 0;
- #undef FSM_TIMEOUT
- }
|