1 /*
2  * Copyright (c) 2006-2018, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2017-10-23     勤为本       first version
9  */
10 
11 // 硬件spi接口的头文件
12 
13 #ifndef __OPENLOONGSON_SPI_H
14 #define __OPENLOONGSON_SPI_H
15 
16 
17 // SPI模块编号
18 #define LS1C_SPI_0                      (0)
19 #define LS1C_SPI_1                      (1)
20 
21 // 片选
22 #define LS1C_SPI_CS_0                   (0)
23 #define LS1C_SPI_CS_1                   (1)
24 #define LS1C_SPI_CS_2                   (2)
25 #define LS1C_SPI_CS_3                   (3)
26 
27 // 时钟极性和相位
28 #define SPI_CPOL_1                      (1)
29 #define SPI_CPOL_0                      (0)
30 #define SPI_CPHA_1                      (1)
31 #define SPI_CPHA_0                      (0)
32 
33 
34 // 寄存器偏移
35 #define LS1C_SPI_SPCR_OFFSET                (0)     // 控制寄存器
36 #define LS1C_SPI_SPSR_OFFSET                (1)     // 状态寄存器
37 #define LS1C_SPI_TxFIFO_OFFSET              (2)     // 发送的数据寄存器,与接收数据寄存器的偏移相同
38 #define LS1C_SPI_RxFIFO_OFFSET              (2)     // 接收的数据寄存器,与发送数据寄存器的偏移相同
39 #define LS1C_SPI_SPER_OFFSET                (3)     // 外部寄存器
40 #define LS1C_SPI_SFC_PARAM_OFFSET           (4)     // 参数控制寄存器
41 #define LS1C_SPI_SFC_SOFTCS_OFFSET          (5)     // 片选控制寄存器
42 #define LS1C_SPI_SFC_TIMING_OFFSET          (6)     // 时序控制寄存器
43 
44 // 寄存器SPCR中的位域
45 #define LS1C_SPI_SPCR_SPIE_BIT              (7)
46 #define LS1C_SPI_SPCR_SPIE_MASK             (0x01 << LS1C_SPI_SPCR_SPIE_BIT)
47 #define LS1C_SPI_SPCR_SPE_BIT               (6)
48 #define LS1C_SPI_SPCR_SPE_MASK              (0x01 << LS1C_SPI_SPCR_SPE_BIT)
49 #define LS1C_SPI_SPCR_CPOL_BIT              (3)
50 #define LS1C_SPI_SPCR_CPOL_MASK             (0x01 << LS1C_SPI_SPCR_CPOL_BIT)
51 #define LS1C_SPI_SPCR_CPHA_BIT              (2)
52 #define LS1C_SPI_SPCR_CPHA_MASK             (0x01 << LS1C_SPI_SPCR_CPHA_BIT)
53 #define LS1C_SPI_SPCR_SPR_BIT               (0)
54 #define LS1C_SPI_SPCR_SPR_MASK              (0x03 << LS1C_SPI_SPCR_SPR_BIT)
55 
56 // 寄存器SPSR中的位域
57 #define LS1C_SPI_SPSR_SPIF_BIT              (7)
58 #define LS1C_SPI_SPSR_SPIF_MASK             (0x01 << LS1C_SPI_SPSR_SPIF_BIT)
59 #define LS1C_SPI_SPSR_WCOL_BIT              (6)
60 #define LS1C_SPI_SPSR_WCOL_MASK             (0x01 << LS1C_SPI_SPSR_WCOL_BIT)
61 
62 // 寄存器SPER中的位域
63 #define LS1C_SPI_SPER_SPRE_BIT              (0)
64 #define LS1C_SPI_SPER_SPRE_MASK             (0x3 << LS1C_SPI_SPER_SPRE_BIT)
65 
66 // 寄存器SFC_SOFTCS的位域
67 #define LS1C_SPI_SFC_SOFTCS_CSN_BIT         (4)
68 #define LS1C_SPI_SFC_SOFTCS_CSN_MASK        (0x0f << LS1C_SPI_SFC_SOFTCS_CSN_BIT)
69 #define LS1C_SPI_SFC_SOFTCS_CSEN_BIT        (0)
70 #define LS1C_SPI_SFC_SOFTCS_CSEN_MASK       (0x0f << LS1C_SPI_SFC_SOFTCS_CSEN_BIT)
71 
72 // 发送超时的门限值
73 #define LS1C_SPI_TX_TIMEOUT                 (20000)
74 
75 
76 
77 /*
78  * 获取指定SPI模块的基地址
79  * @SPIx SPI模块的编号
80  */
81 void *ls1c_spi_get_base(unsigned char SPIx);
82 
83 
84 /*
85  * 设置时钟
86  * @spi_base 基地址
87  * @max_hz 最大频率,单位hz
88  */
89 void ls1c_spi_set_clock(void *spi_base, unsigned long max_hz);
90 
91 
92 /*
93  * 设置通信模式(时钟极性和相位)
94  * @spi_base 基地址
95  * @cpol 时钟极性
96  * @cpha 时钟相位
97  */
98 void ls1c_spi_set_mode(void *spi_base, unsigned char cpol, unsigned char cpha);
99 
100 
101 /*
102  * 设置指定片选为指定状态
103  * @spi_base 基地址
104  * @cs 片选
105  * @new_status 片选引脚的新状态,取值为0或1,即高电平或低电平
106  */
107 void ls1c_spi_set_cs(void *spi_base, unsigned char cs, int new_status);
108 
109 
110 /*
111  * 通过指定SPI发送接收一个字节
112  * 注意,在多任务的系统中,此函数需要互斥。
113  * 即保证在和某个从设备收发某个字节的过程中,不能被切换到其它任务同时与另外的在同一个SPI总线上的从设备通信
114  * 因为龙芯1c的每路SPI上可能接有不同的从设备,通信频率、模式等可能不同
115  * @spi_base 基地址
116  * @tx_ch 待发送的数据
117  * @ret 收到的数据
118  */
119 unsigned char ls1c_spi_txrx_byte(void *spi_base, unsigned char tx_ch);
120 
121 
122 /*
123  * 打印指定SPI模块的所有寄存器的值
124  * @spi_base 基地址
125  */
126 void ls1c_spi_print_all_regs_info(void *spi_base);
127 
128 
129 
130 
131 #endif
132 
133