zhyinch
2021-03-17 dbdff32c9e492abf93f618efe526d0961428bd88
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include "Spi.h"
#include "deca_device_api.h"
 
 
 
 
void Spi_ChangePrescaler(uint16_t scaling_factor)
{
    uint16_t tmpreg = 0;
 
    /* Get the SPIx CR1 value */
    tmpreg = SPIx->CR1;
 
    /*clear the scaling bits*/
    tmpreg &= 0xFFC7;
 
    /*set the scaling bits*/
    tmpreg |= scaling_factor;
 
    /* Write to SPIx CR1 */
    SPIx->CR1 = tmpreg;
}
 
/*! ------------------------------------------------------------------------------------------------------------------
 * Function: writetospi()
 *
 * Low level abstract function to write to the SPI
 * Takes two separate byte buffers for write header and write data
 * returns 0 for success, or -1 for error
 */
uint8_t tt;
int writetospi
(
    uint16_t       headerLength,
     uint8_t *headerBuffer,
    uint32_t       bodylength,
     uint8_t *bodyBuffer
)
{
 
    int i = 0;
 
    decaIrqStatus_t  stat ;
 
//    stat = decamutexon() ;
 
    SPIx_CS_GPIO->BRR = SPIx_CS;
//    delay_ms(1);
//    tt=HAL_SPI_Transmit(&hspi1,headerBuffer,headerLength,10);
//    tt=HAL_SPI_Transmit(&hspi1,bodyBuffer,bodylength,10);
//        delay_ms(1);
    for(i = 0; i < headerLength; i++)
    {
                SPIx->DR= headerBuffer[i];
        while ((SPIx->SR & SPI_FLAG_RXNE) == (uint16_t)RESET);                
        SPIx->DR;
 
    }
 
    for(i = 0; i < bodylength; i++)
    {
        SPIx->DR = bodyBuffer[i];
              while ((SPIx->SR & SPI_FLAG_RXNE) == (uint16_t)RESET);        
        SPIx->DR ;
    }
 
    SPIx_CS_GPIO->BSRR = SPIx_CS;
 
  //  decamutexoff(stat) ;
 
    return 0;
} // end writetospi()
 
 
/*! ------------------------------------------------------------------------------------------------------------------
 * Function: readfromspi()
 *
 * Low level abstract function to read from the SPI
 * Takes two separate byte buffers for write header and read data
 * returns the offset into read buffer where first byte of read data may be found,
 * or returns -1 if there was an error
 */
int readfromspi
(
    uint16_t       headerLength,
     uint8_t *headerBuffer,
    uint32_t       readlength,
    uint8_t       *readBuffer
)
{
 
    int i = 0;
 
    decaIrqStatus_t  stat ;
 
   // stat = decamutexon() ;
 
    /* Wait for SPIx Tx buffer empty */
    //while (port_SPIx_busy_sending());
 
    SPIx_CS_GPIO->BRR = SPIx_CS;
//    HAL_SPI_Transmit(&hspi1,headerBuffer,headerLength,10);
//    HAL_SPI_Receive(&hspi1,readBuffer,readlength,10);
    for(i = 0; i < headerLength; i++)
    {
        SPIx->DR = headerBuffer[i];
 
        while((SPIx->SR & SPI_FLAG_RXNE) == (uint16_t)RESET);
 
        readBuffer[0] = SPIx->DR ; // Dummy read as we write the header
    }
 
    for(i = 0; i < readlength; i++)
    {
        SPIx->DR = 0;  // Dummy write as we read the message body
 
        while((SPIx->SR & SPI_FLAG_RXNE) == (uint16_t)RESET);
 
        readBuffer[i] = SPIx->DR ;//port_SPIx_receive_data(); //this clears RXNE bit
    }
 
    SPIx_CS_GPIO->BSRR = SPIx_CS;
 
   // decamutexoff(stat) ;
 
    return 0;
} // end readfromspi()