Описание библиотеки микросхемы 5023ВС016 процессора "Спутник"
spi_test.c
См. документацию.
1 
29 #include "spi_test.h"
30 
31 const uint32_t sys_freq = 80000000; // Системная частота
32 char dbg_buffer[256]; // Отладочный буфер
33 
34 
35 #define SPI_BUF_SIZE 64
36 #define SPI_DATA_BIT_NUM(databits) (databits+1)
37 #define SPI_DATA_BYTES(databits) (((databits) > SPI_BITS_8) ? 2:1)
38 #define SPI_LO_BYTE_MSK(databits) ((SPI_DATA_BYTES(databits) > 1) ? 0xFF:(0xFF>>(8-SPI_DATA_BIT_NUM(databits))))
39 #define SPI_HI_BYTE_MSK(databits) ((SPI_DATA_BYTES(databits) > 1) ? (0xFF>>(16-SPI_DATA_BIT_NUM(databits))):0)
40 
41 
42 #pragma data_alignment = 0x400
43 #pragma location=".noinit"
45 
46 static uint8_t dma_tx_done;
47 static uint8_t dma_rx_done;
48 static uint8_t int_done;
49 static uint16_t Master_Tx_Buf[SPI_BUF_SIZE];
50 static uint16_t Slave_Tx_Buf[SPI_BUF_SIZE];
51 static uint16_t Master_Rx_Buf[SPI_BUF_SIZE];
52 static uint16_t Slave_Rx_Buf[SPI_BUF_SIZE];
56 
61 {
62  CMN_REG->ALT_FUNCTION_CTRL[3] = 0; // Для GPIO_E
63  GPIO_D->ALTFUNCSET =(GPIO_D->ALTFUNCSET&0)|(1<<7)|(1<<8)|(1<<9)|(1<<10)
64  |(1<<11)|(1<<12)|(1<<13)|(1<<14);
65 }
66 
70 static uint8_t Buffer_Verify(uint8_t bits, uint16_t * src_addr, uint16_t * dst_addr)
71 {
72  uint16_t i;
73  for ( i = 0; i < SPI_BUF_SIZE; i++ )
74  {
75  if (((*src_addr) & SPI_LO_BYTE_MSK(bits)) !=
76  ((*dst_addr) & SPI_LO_BYTE_MSK(bits)))
77  {
78  return 1;
79  }
80  src_addr++;
81  dst_addr++;
82 
83  if (SPI_DATA_BYTES(bits) == 2)
84  {
85  if (((*src_addr) & SPI_HI_BYTE_MSK(bits)) !=
86  ((*dst_addr) & SPI_HI_BYTE_MSK(bits)))
87  {
88  return 1;
89  }
90  src_addr++;
91  dst_addr++;
92  i++;
93  }
94  }
95  return 0;
96 }
97 
101 void SPI_1_IRQ(void)
102 {
103 
104 
105  for (int i = 0; i < SPI_BUF_SIZE; i++)
106  {
108  while (SPI_GetStatus(SPI1, SPI_SR_BSY) == SET) {}
110  }
113  NVIC_DisableIRQ(6);
114  int_done = 1;
115 }
116 
120 void SPI_2_IRQ(void)
121 {
122 
123  for (int i = 0; i < SPI_BUF_SIZE; i++)
124  {
125  while (!(SPI_GetStatus(SPI2, SPI_SR_RFF) == SET)) {}
127  }
128  int_done = 1;
129  NVIC_DisableIRQ(7);
130 }
131 
136 {
137  dma_tx_done = 1;
138  SPI1->DMACR &= (~SPI_DMACR_TXDMAE) & SPI_DMACR_BITMASK;
139  NVIC_DisableIRQ(26);
140 }
141 
146 {
147  dma_rx_done = 1;
148  SPI2->DMACR &= (~SPI_DMACR_RXDMAE) & SPI_DMACR_BITMASK;
149  NVIC_DisableIRQ(27);
150 }
152 {
153  uint16_t i = 0;
154  ssp_config.bits = SPI_BITS_16;
155  ssp_config.clockMode = SPI_CLOCK_MODE1;
156  ssp_config.frameFormat = SPI_FRF_SPI;
157 
158  SPI_Init(SPI1);
160  SPI_SetFormat(SPI1, ssp_config.bits, ssp_config.clockMode, ssp_config.frameFormat);
161  SPI_SetBitRate(SPI1, 8000000);
162 
163  SPI_Init(SPI2);
165  SPI_SetFormat(SPI2, ssp_config.bits, ssp_config.clockMode, ssp_config.frameFormat);
166  SPI_SetBitRate(SPI2, 8000000);
167 
168  SPI_Enable(SPI1);
169  SPI_Enable(SPI2);
170 
171  for (i = 0; i < SPI_BUF_SIZE; i++)
172  {
173  Master_Tx_Buf[i] = i;
174  Master_Rx_Buf[i] = 0xAAAA;
175  Slave_Tx_Buf[i] = i;
176  Slave_Rx_Buf[i] = 0xAAAA;
177  }
178 
179  master_setup.length = SPI_BUF_SIZE << (SPI_DATA_BYTES(ssp_config.bits) - 1);
180  master_setup.tx_data = Master_Tx_Buf;
181  master_setup.rx_data = Master_Rx_Buf;
182  master_setup.rx_cnt = master_setup.tx_cnt = 0;
183 
184  slave_setup.length = SPI_BUF_SIZE << (SPI_DATA_BYTES(ssp_config.bits) - 1);
185  slave_setup.tx_data = Slave_Tx_Buf;
186  slave_setup.rx_data = Slave_Rx_Buf;
187  slave_setup.rx_cnt = master_setup.tx_cnt = 0;
188 }
192 uint32_t SPI_Test(void)
193 {
194  start_init();
195  Init_ports_SPI(); // Настройка портов GPIO для модуля SPI
196 
197  PRINT("Тестирование SPI");
198 
199 /*****************************************************************************
200  * Режим опроса
201  ****************************************************************************/
202 
203  PRINTSTREAM(" Режим опроса завершен ");
204 
205  for (int i = 0; i < SPI_BUF_SIZE; i++)
206  {
208  while (SPI_GetStatus(SPI1, SPI_SR_BSY) == SET) {}
210  }
211 
212  if (Buffer_Verify(16, Master_Tx_Buf, Slave_Rx_Buf) == 0)
213  {
214  PRINTSTREAM("успешно\r\n");
215  }
216  else
217  {
218  PRINTSTREAM("неуспешно \r\n");
219  SPI_DeInit(SPI1);
220  SPI_DeInit(SPI2);
221  PRINT("Тест SSP завершен с ошибкой");
222  return false;
223  }
224 
225  for (int i = 0; i < SPI_BUF_SIZE; i++)
226  {
227  Master_Tx_Buf[i] = i;
228  Master_Rx_Buf[i] = 0xAAAA;
229  Slave_Tx_Buf[i] = i;
230  Slave_Rx_Buf[i] = 0xAAAA;
231  }
232  master_setup.rx_cnt = master_setup.tx_cnt = 0;
233  slave_setup.rx_cnt = master_setup.tx_cnt = 0;
234  DBG_TX_Flush();
235 
236 /*****************************************************************************
237  * Режим c прерываниями
238  ****************************************************************************/
239 
240 
241  PRINTSTREAM(" Режим c прерываниями завершен ");
242  start_init();
243  int_done = 0;
246 
248 
249  NVIC_EnableIRQ(SPI_1,6);
250 
251  while (!int_done) {}
252 
255 
257  {
258  PRINTSTREAM("успешно\r\n");
259  }
260  else
261  {
262  PRINTSTREAM("неуспешно \r\n");
263  SPI_DeInit(SPI1);
264  SPI_DeInit(SPI2);
265  PRINT("Тест SSP завершен с ошибкой");
266  return false;
267  }
268 
269  for (int i = 0; i < SPI_BUF_SIZE; i++)
270  {
271  Master_Tx_Buf[i] = i;
272  Master_Rx_Buf[i] = 0xAAAA;
273  Slave_Tx_Buf[i] = i;
274  Slave_Rx_Buf[i] = 0xAAAA;
275  }
276  master_setup.rx_cnt = master_setup.tx_cnt = 0;
277  slave_setup.rx_cnt = master_setup.tx_cnt = 0;
278  DBG_TX_Flush();
279 
280 
281 /*****************************************************************************
282  * Режим c DMA
283  ****************************************************************************/
284 
285  start_init();
286 
287  PRINTSTREAM(" Режим c DMA завершен ");
288  dma_tx_done = 0;
289  dma_rx_done = 0;
290 
291  DMA->CFG = 1;
292  DMA->CTRL_BASE_PTR = (uint32_t) &DMA_SPI_CTRL;
293 
294  DMA->CHNL_ENABLE_SET = 0x0F;
295  DMA->CHNL_USEBURST_CLR |= 0x0F;
296 
297  DMA_SPI_CTRL.prim_chan[0].src_data_end_ptr = (uint32_t)&Master_Tx_Buf[SPI_BUF_SIZE - 1];
298  DMA_SPI_CTRL.prim_chan[0].dst_data_end_ptr = SPI1_BASE + 8;
299  DMA_SPI_CTRL.prim_chan[0].ctrl = DMA_CCTRL_BASIC | DMA_NEXT_USEBURST_DIS | \
300  DMA_N_MINUS_1(SPI_BUF_SIZE - 1) | DMA_R_POWER(2) | \
301  DMA_SRC_PROT_CACHE_DIS | DMA_SRC_PROT_BUFFER_DIS | DMA_SRC_PROT_PRIVILEGE_DIS | \
302  DMA_DST_PROT_CACHE_DIS | DMA_DST_PROT_BUFFER_DIS | DMA_DST_PROT_PRIVILEGE_DIS | \
303  DMA_SRC_DATA_SIZE_HALFWORD | DMA_SRC_ADDR_INC_HALFWORD | \
304  DMA_DST_DATA_SIZE_HALFWORD | DMA_DST_ADDR_INC_NULL;
305 
306  DMA_SPI_CTRL.prim_chan[3].src_data_end_ptr = SPI2_BASE + 8;
307  DMA_SPI_CTRL.prim_chan[3].dst_data_end_ptr = (uint32_t)&Slave_Rx_Buf[SPI_BUF_SIZE - 1];
308  DMA_SPI_CTRL.prim_chan[3].ctrl = DMA_CCTRL_BASIC | DMA_NEXT_USEBURST_DIS | \
309  DMA_N_MINUS_1(SPI_BUF_SIZE - 1) | DMA_R_POWER(2) | \
310  DMA_SRC_PROT_CACHE_DIS | DMA_SRC_PROT_BUFFER_DIS | DMA_SRC_PROT_PRIVILEGE_DIS | \
311  DMA_DST_PROT_CACHE_DIS | DMA_DST_PROT_BUFFER_DIS | DMA_DST_PROT_PRIVILEGE_DIS | \
312  DMA_SRC_DATA_SIZE_HALFWORD | DMA_SRC_ADDR_INC_NULL | \
313  DMA_DST_DATA_SIZE_HALFWORD | DMA_DST_ADDR_INC_HALFWORD;
314 
319 
320  SPI1->DMACR |= SPI_DMACR_TXDMAE;
321  SPI2->DMACR |= SPI_DMACR_RXDMAE;
322 
323  while ((!(dma_tx_done)) || (!(dma_rx_done))) {}
324 
325  if (Buffer_Verify(16, Master_Tx_Buf, Slave_Rx_Buf) == 0)
326  {
327  PRINTSTREAM("успешно\r\n");
328  }
329  else
330  {
331  PRINTSTREAM("неуспешно \r\n");
332  SPI_DeInit(SPI1);
333  SPI_DeInit(SPI2);
334  PRINT("Тест SSP завершен с ошибкой");
335  return false;}
336 
337  SPI_DeInit(SPI1);
338  SPI_DeInit(SPI2);
339  PRINT("Тест SSP завершен успешно");
340  return true;
341 }
342 
343 
void SPI_DeInit(SPI_T *pSPI)
Сброс SPI.
Definition: spi.c:41
void start_init()
Definition: spi_test.c:151
static uint16_t Master_Tx_Buf[SPI_BUF_SIZE]
Definition: spi_test.c:49
#define DMA_DST_PROT_BUFFER_DIS
Definition: dma.h:92
#define SPI_LO_BYTE_MSK(databits)
Definition: spi_test.c:38
uint16_t SPI_ReceiveFrame(SPI_T *pSPI)
Прием слова данных по интерфейсу SPI.
Definition: spi.c:186
#define DMA
Указатель на структуру DMA.
#define SPI_TXInt_Disable(gl_spi_t)
Definition: spi.h:224
#define PRINT(...)
Макросы для использования отладочного выхода
Definition: debug_uart.h:48
Структура для доступа к управлющим данным всех каналов
Definition: dma.h:129
#define PRINTSTREAM(...)
Печать в СОМ порт
Definition: debug_uart.h:49
Definition: system.h:149
uint32_t src_data_end_ptr
Definition: dma.h:120
SPI_CLOCK_MODE_T clockMode
Definition: spi.h:189
void NVIC_EnableIRQ(IRQn_T IRQn, uint32_t vec)
Разрешение прерывания
Definition: system.c:74
void SPI_SetFormat(SPI_T *pSPI, uint32_t pbits, uint32_t pframeFormat, uint32_t pclockMode)
Установка формата информационного кадра
Definition: spi.c:97
#define SPI_HI_BYTE_MSK(databits)
Definition: spi_test.c:39
uint32_t rx_cnt
Definition: spi.h:201
static uint16_t Slave_Rx_Buf[SPI_BUF_SIZE]
Definition: spi_test.c:52
#define DMA_DST_PROT_PRIVILEGE_DIS
Definition: dma.h:95
#define SPI_RXInt_Enable(gl_spi_t)
Definition: spi.h:227
#define SPI_Enable(gl_spi_t)
Definition: spi.h:206
static SPI_CONFIG_T ssp_config
Definition: spi_test.c:53
#define DMA_SRC_ADDR_INC_HALFWORD
Definition: dma.h:102
SPI_BITS_T bits
Definition: spi.h:188
static uint8_t int_done
Definition: spi_test.c:48
DMA_CTRL_T DMA_SPI_CTRL
Definition: spi_test.c:44
#define SPI_BUF_SIZE
Definition: spi_test.c:35
static SPI_DATA_SETUP_T master_setup
Definition: spi_test.c:54
#define SPI_TXInt_Enable(gl_spi_t)
Definition: spi.h:221
#define SPI2
Указатель на структуру SPI2.
#define SPI1_BASE
Этот файл содержит структуры, макросы и функции необходимые необходимые для тестовой программы для ап...
#define DMA_NEXT_USEBURST_DIS
Definition: dma.h:74
char dbg_buffer[256]
Отладочный буфер
Definition: spi_test.c:32
FlagStatus SPI_GetStatus(SPI_T *pSPI, SPI_STATUS_T pStat)
Получение текущего статуса контроллера SPI.
Definition: spi.c:578
volatile uint32_t ctrl
Definition: dma.h:122
Структура настройки SPI.
Definition: spi.h:186
void * tx_data
Definition: spi.h:198
void DMA_DONE_SPI_2_IRQ(void)
Обработчик прерывания для DMA SPI2.
Definition: spi_test.c:145
SPI_FRAME_FORMAT_T frameFormat
Definition: spi.h:190
uint32_t SPI_Test(void)
Основная программа тестирования SPI.
Definition: spi_test.c:192
void Init_ports_SPI()
настройка портов для SPI для первого из режимов альтернативных функций
Definition: spi_test.c:60
static SPI_DATA_SETUP_T slave_setup
Definition: spi_test.c:55
#define SPI1
Указатель на структуру SPI1.
uint32_t length
Definition: spi.h:202
Структура для работы с буфером SPI.
Definition: spi.h:196
Definition: system.h:148
void DMA_DONE_SPI_1_IRQ(void)
Обработчик прерывания для DMA SPI1.
Definition: spi_test.c:135
void NVIC_DisableIRQ(uint32_t vec)
Запрещение прерывания
Definition: system.c:347
#define DMA_SRC_PROT_BUFFER_DIS
Definition: dma.h:83
#define SPI2_BASE
#define DMA_DST_ADDR_INC_NULL
Definition: dma.h:113
static uint16_t Slave_Tx_Buf[SPI_BUF_SIZE]
Definition: spi_test.c:50
#define DMA_SRC_PROT_PRIVILEGE_DIS
Definition: dma.h:86
void SPI_1_IRQ(void)
Обработчик прерываний от SPI1.
Definition: spi_test.c:101
void SPI_2_IRQ(void)
Обработчик прерываний от SPI2.
Definition: spi_test.c:120
uint32_t tx_cnt
Definition: spi.h:199
uint32_t dst_data_end_ptr
Definition: dma.h:121
#define DMA_DST_ADDR_INC_HALFWORD
Definition: dma.h:111
void SPI_SendFrame(SPI_T *pSPI, uint16_t tx_data)
Отправка слова данных по интерфейсу SPI.
Definition: spi.c:176
static uint8_t Buffer_Verify(uint8_t bits, uint16_t *src_addr, uint16_t *dst_addr)
Проверка данных после транзакции
Definition: spi_test.c:70
#define DMA_CCTRL_BASIC
Definition: dma.h:64
static uint8_t dma_rx_done
Definition: spi_test.c:47
void SPI_Set_Mode(SPI_T *pSPI, uint32_t pmode)
Установка режима работы (ведущий или ведомый).
Definition: spi.c:111
void SPI_SetBitRate(SPI_T *pSPI, uint32_t bitRate)
Установка частоты тактового сигнала для интерфейса SPI.
Definition: spi.c:137
DMA_CHNL_CTRL_T prim_chan[32]
Definition: dma.h:131
void SPI_Init(SPI_T *pSPI)
Инициализация SPI.
Definition: spi.c:54
#define SPI_DATA_BYTES(databits)
Definition: spi_test.c:37
#define CMN_REG
Указатель на структуру CMN_REG.
void SPI_Int_FlushData(SPI_T *pSPI)
Очистка буфера приемника и сброс флагов прерываний.
Definition: spi.c:549
void DBG_TX_Flush(void)
Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART.
Definition: debug_uart.c:80
Definition: types.h:64
static uint16_t Master_Rx_Buf[SPI_BUF_SIZE]
Definition: spi_test.c:51
#define DMA_R_POWER(n)
Definition: dma.h:77
void * rx_data
Definition: spi.h:200
#define DMA_SRC_ADDR_INC_NULL
Definition: dma.h:104
static uint8_t dma_tx_done
Definition: spi_test.c:46
const uint32_t sys_freq
Системная частота
Definition: spi_test.c:31
#define GPIO_D
Указатель на структуру GPIO_D.