qipp
2025-11-07 1db34b4e65f72d8ae8b1f0efbc7a4395f9bbcae8
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
/*
 * spi.c
 *
 *  Created on: 2021Äê6ÔÂ26ÈÕ
 *      Author: graydon
 */
#include <stdint.h>
#include <stdio.h>
#include <sru.h>
#include <def1802.h>
#include <cdef1802.h>
//#include <def21489.h>
//#include <cdef21489.h>
#include <services/int/adi_int.h>
#include <signal.h>
#include "spi.h"
#include "config.h"
 
 
 
typedef struct{
    spi_status_e  status;
    spi_direction_e    direction;
    short  spi_buff[SPI_PKT_SIZE];
}spi_event,*pspi_event;
 
static spi_event spi;
 
static void SPIDMA_Handler(uint32_t iid, void* arg)
{
    adi_int_ClearPending(iid);
    *pSPICTL = 0; //½ûÖ¹SPI £¬·ñÔò¿ÉÄܵ¼ÖÂËÀ»ú
    spi.status = spi_completed;
    SRU(LOW,DPI_PB11_I); //֪ͨMCU Í£Ö¹SPIͨÐÅ
}
 
void spi_config_dma(spi_direction_e direction)
{
    //change receive to a new dma
    if(spi.direction==spi_tx){
        *pSPICTL = 0;
        *pSPIDMAC = 0;
        *pSPISTAT = 0x56;
    }
    else if(spi.direction==spi_rx){
        *pSPICTL = 0;
        *pSPIDMAC = 0x00000080;
        *pSPISTAT = 0x56;
    }
 
 
 
    *pIISPI = (int)spi.spi_buff;
    *pIMSPI = 1;
    *pCSPI = SPI_PKT_SIZE;
 
    *pSPICTL = (SPIEN | WL16 | LSBF | TIMOD2| CPHASE |CLKPL |GM);
 
    if(direction==spi_tx){
        *pSPIDMAC = SPIDEN | INTEN |INTETC ;
    }
    else if(direction==spi_rx){
        *pSPIDMAC = SPIDEN | SPIRCV | INTEN |INTETC ;
    }
 
    spi.direction = direction;
    spi.status = spi_processing;
}
 
 
int spi_init()
{
    *pSPICTL = 0 ;
    *pSPIFLG = 0;
    *pSPISTAT= 0x56;
    *pSPIDMAC = 0;
    *pSPIBAUD = 0;
 
    adi_int_InstallHandler(ADI_CID_SPIHI, SPIDMA_Handler, 0, true);
 
    spi_config_dma(spi_rx);
    //spi.status = spi_completed;
    //spi.direction = spi_tx;
 
    return 0;
}
 
 
spi_status_e spi_get_status()
{
    return spi.status;
}
 
void* spi_get_buffer()
{
    return (void*)spi.spi_buff;
}
 
spi_direction_e spi_get_direction()
{
    return spi.direction;
}