1/** 2 * @file hi_spi.h 3 * 4 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED. 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 * 描述:SPI SDK APIs. CNcomment:SPI SDK调用接口。CNend 18 * @li Supports synchronous serial communication with external devices as the master or slave. 19 CNcomment:支持作为Master或Slave与外部设备进行同步串行通信。CNend 20 * @li The SPI working reference clock is 160 MHz, the maximum output of Master SPI_CLK is 40 MHz, and the maximum 21 * output of Slave SPI_CLK is 20 MHz. CNcomment:SPI工作参考时钟为160 MHz, 22 作为Master SPI_CLK最大输出为40MHz,作为Slave SPI_CLK最大支持20MHz。CNend 23 * @li Provides two SPIs. The SPI0 provides one TX/RX FIFO for the 16bit×256, and the SPI1 provides one TX/RX 24 * FIFO for the 16bit×64. CNcomment:提供两路SPI,SPI0提供16bit×256的TX/RX FIFO各一个, 25 SPI1提供16bit×64的TX/RX FIFO各一个。CNend 26 * @li Only full-duplex communication is supported. When the half-duplex mode is used, the fixed value is sent. 27 * When the half-duplex mode is used, the data in the FIFO is discarded. 28 CNcomment:只支持全双工通信,半双工收时发送固定数值,半双工收时丢弃FIFO中的数据。CNend \n 29 */ 30 31/** 32 * @defgroup iot_spi SPI 33 * @ingroup drivers 34 */ 35 36#ifndef __HI_SPI_H__ 37#define __HI_SPI_H__ 38#include <hi_types.h> 39 40/** 41* @ingroup iot_spi 42* 43* Channel ID, [0,1]. CNcomment:通道ID:0~1。CNend 44*/ 45typedef enum { 46 HI_SPI_ID_0 = 0, 47 HI_SPI_ID_1, 48} hi_spi_idx; 49 50/** 51* @ingroup iot_spi 52* 53* Communication polarity.CNcomment:通信极性。CNend 54*/ 55typedef enum { 56 HI_SPI_CFG_CLOCK_CPOL_0, /**< Polarity 0.CNcomment:极性0 CNend */ 57 HI_SPI_CFG_CLOCK_CPOL_1, /**< Polarity 1.CNcomment:极性1 CNend */ 58} hi_spi_cfg_clock_cpol; 59 60/** 61* @ingroup iot_spi 62* 63* Communication phase.CNcomment:通信相位。CNend 64*/ 65typedef enum { 66 HI_SPI_CFG_CLOCK_CPHA_0, /**< Phase 0.CNcomment:相位0 CNend */ 67 HI_SPI_CFG_CLOCK_CPHA_1, /**< Phase 1.CNcomment:相位1 CNend */ 68} hi_spi_cfg_clock_cpha; 69 70/** 71* @ingroup iot_spi 72* 73* Communication protocol type. CNcomment:通信协议类型。CNend 74*/ 75typedef enum { 76 HI_SPI_CFG_FRAM_MODE_MOTOROLA, /**< Motorola protocol.CNcomment:摩托罗拉协议CNend */ 77 HI_SPI_CFG_FRAM_MODE_TI, /**< Texas Instruments protocol.CNcomment:德州仪器协议CNend */ 78 HI_SPI_CFG_FRAM_MODE_MICROWIRE, /**< Microwire protocol.CNcomment:Microware协议CNend */ 79} hi_spi_cfg_fram_mode; 80 81/** 82* @ingroup iot_spi 83* 84* Communication bit width, that is, number of valid bits in each frame.CNcomment:通信位宽, 85每帧内的有效bit数。CNend 86*/ 87typedef enum { 88 HI_SPI_CFG_DATA_WIDTH_E_4BIT = 0x3, /**< The bit width is 4 bits.CNcomment:位宽为4bit CNend */ 89 HI_SPI_CFG_DATA_WIDTH_E_5BIT, /**< The bit width is 5 bits.CNcomment:位宽为5bit CNend */ 90 HI_SPI_CFG_DATA_WIDTH_E_6BIT, /**< The bit width is 6 bits.CNcomment:位宽为6bit CNend */ 91 HI_SPI_CFG_DATA_WIDTH_E_7BIT, /**< The bit width is 7 bits.CNcomment:位宽为7bit CNend */ 92 HI_SPI_CFG_DATA_WIDTH_E_8BIT, /**< The bit width is 8 bits.CNcomment:位宽为8bit CNend */ 93 HI_SPI_CFG_DATA_WIDTH_E_9BIT, /**< The bit width is 9 bits.CNcomment:位宽为9bit CNend */ 94 HI_SPI_CFG_DATA_WIDTH_E_10BIT, /**< The bit width is 10 bits.CNcomment:位宽为10bit CNend */ 95 HI_SPI_CFG_DATA_WIDTH_E_11BIT, /**< The bit width is 11 bits.CNcomment:位宽为11bit CNend */ 96 HI_SPI_CFG_DATA_WIDTH_E_12BIT, /**< The bit width is 12 bits.CNcomment:位宽为12bit CNend */ 97 HI_SPI_CFG_DATA_WIDTH_E_13BIT, /**< The bit width is 13 bits.CNcomment:位宽为13bit CNend */ 98 HI_SPI_CFG_DATA_WIDTH_E_14BIT, /**< The bit width is 14 bits.CNcomment:位宽为14bit CNend */ 99 HI_SPI_CFG_DATA_WIDTH_E_15BIT, /**< The bit width is 15 bits.CNcomment:位宽为15bit CNend */ 100 HI_SPI_CFG_DATA_WIDTH_E_16BIT, /**< The bit width is 16 bits.CNcomment:位宽为16bit CNend */ 101} hi_spi_cfg_data_width; 102 103/** 104* @ingroup iot_spi 105* 106* Communication parameter: big-endian and little-endian transmission of each frame. 107CNcomment:通信参数:每帧的传输大小端。CNend 108*/ 109typedef enum { 110 HI_SPI_CFG_ENDIAN_LITTLE, /**< Little-endian transmission.CNcomment:小端传输CNend */ 111 HI_SPI_CFG_ENDIAN_BIG, /**< Big-endian transmission.CNcomment:大端传输CNend */ 112} hi_spi_cfg_endian; 113 114/** 115* @ingroup iot_spi 116* @brief Type of the SPI callback function.CNcomment:SPI回调函数的类型。CNend 117* 118* @par 描述: 119* Type of the SPI callback function.CNcomment:SPI回调函数的类型。CNend 120* 121* @attention None 122* 123* @param None 124* 125* @retval None 126* 127* @par 依赖: 128* @li hi_spi.h:Describes the SPI APIs.CNcomment:文件用于描述SPI相关接口。CNend 129* @see None 130*/ 131typedef hi_void (*hi_spi_usr_func)(hi_void); 132 133/** 134 * @ingroup iot_spi 135 * 136 * Data communication parameter.CNcomment:数据通信参数。CNend 137 */ 138typedef struct { 139 hi_u32 cpol : 1; /**< Communication polarity, type hi_spi_cfg_clock_cpol.CNcomment:通信极性,类型 140 为hi_spi_cfg_clock_cpol。CNend */ 141 hi_u32 cpha : 1; /**< Communication phase, type hi_spi_cfg_clock_cpha.CNcomment:通信相位,类型 142 为hi_spi_cfg_clock_cpha。CNend */ 143 hi_u32 fram_mode : 2; /**< Communication protocol type, type hi_spi_cfg_fram_mode.CNcomment:通信协议类型,类型 144 为hi_spi_cfg_fram_mode。CNend */ 145 hi_u32 data_width : 4; /**< Communication bit width, type hi_spi_cfg_data_width.CNcomment:通信位宽,类型为 146 hi_spi_cfg_data_width。 CNend */ 147 hi_u32 endian : 1; /**< Big-endian and little-endian, type hi_spi_cfg_endian.CNcomment:大小端,类型为 148 hi_spi_cfg_endian。CNend */ 149 hi_u32 pad : 23; /**< Reserve bits.CNcomment:保留位 CNend */ 150 hi_u32 freq; /**< Communication frequency, ranges 2460Hz-40MHz.CNcomment:通信频率,取值范围 151 2460Hz-40MHz。CNend */ 152} hi_spi_cfg_basic_info; 153 154/** 155 * @ingroup iot_spi 156 * 157 * Data communication parameter.CNcomment:主从设备设置。CNend 158 */ 159typedef struct { 160 hi_u32 is_slave : 1; 161 hi_u32 pad : 31; 162} hi_spi_cfg_init_param; 163/** 164* @ingroup iot_spi 165* @brief TX interface for the SPI slave mode.CNcomment:SPI从模式发送接口。CNend 166* 167* @par 描述: 168* TX interface for the SPI slave mode.CNcomment:SPI从模式发送接口。CNend 169* 170* @attention None 171* 172* @param spi_id [IN] type #hi_spi_idx,SPI ID。 173* @param write_data [IN] type #hi_pvoid,TX data pointer.CNcomment;发送数据指针。CNend 174* @param byte_len [IN] type #hi_u32,length of the target data to be sent (unit: byte). 175CNcomment:发送数据长度(单位:byte)。CNend 176* @param time_out_ms [IN] type #hi_u32,wait timeout period.CNcomment:超时时间。CNend 177* 178* @retval #0 Success 179* @retval #Other Failure. For details, see hi_errno.h. 180* @par 依赖: 181* @li hi_spi.h:Describes the SPI APIs.CNcomment:文件用于描述SPI相关接口。CNend 182* @see None 183*/ 184hi_u32 hi_spi_slave_write(hi_spi_idx spi_id, hi_pvoid write_data, hi_u32 byte_len, hi_u32 time_out_ms); 185 186/** 187* @ingroup iot_spi 188* @brief RX interface for the SPI slave mode.CNcomment:SPI从模式接收接口。CNend 189* 190* @par 描述: 191* RX interface for the SPI slave mode.CNcomment:SPI从模式接收接口。CNend 192* 193* @attention None 194* 195* @param spi_id [IN] type #hi_spi_idx,SPI ID。 196* @param read_data [OUT] type #hi_pvoid,RX data pointer.CNcomment:接收数据指针。CNend 197* @param byte_len [IN] type #hi_u32,length of the target data to be received (unit: byte). 198CNcomment:接收数据长度(单位:byte)。CNend 199* @param time_out_ms [IN] type #hi_u32,wait timeout period.CNcomment:超时时间。CNend 200* 201* @retval #0 Success 202* @retval #Other Failure. For details, see hi_errno.h. 203* @par 依赖: 204* @li hi_spi.h:Describes the SPI APIs.CNcomment:文件用于描述SPI相关接口。CNend 205* @see None 206*/ 207hi_u32 hi_spi_slave_read(hi_spi_idx spi_id, hi_pvoid read_data, hi_u32 byte_len, hi_u32 time_out_ms); 208 209/** 210* @ingroup iot_spi 211* @brief Half-duplex TX interface for the SPI master mode.CNcomment:SPI主模式半双工发送接口。CNend 212* 213* @par 描述: 214* Half-duplex TX interface for the SPI master mode.CNcomment: SPI主模式半双工发送接口。CNend 215* 216* @attention None 217* 218* @param spi_id [IN] type #hi_spi_idx,SPI ID。 219* @param write_data [IN] type #hi_pvoid,TX data pointer.CNcomment;发送数据指针。CNend 220* @param byte_len [IN] type #hi_u32,length of the target data to be sent (unit: byte). 221CNcomment:发送数据长度(单位:byte)。CNend 222* 223* @retval #0 Success 224* @retval #Other Failure. For details, see hi_errno.h. 225* @par 依赖: 226* @li hi_spi.h:Describes the SPI APIs.CNcomment:文件用于描述SPI相关接口。CNend 227* @see None 228*/ 229hi_u32 hi_spi_host_write(hi_spi_idx spi_id, hi_pvoid write_data, hi_u32 byte_len); 230 231/** 232* @ingroup iot_spi 233* @brief Half-duplex RX interface for the SPI master mode.CNcomment:SPI主模式半双工接收接口。CNend 234* 235* @par 描述: 236* Half-duplex RX interface for the SPI master mode.CNcomment:SPI主模式半双工接收接口。CNend 237* 238* @attention None 239* 240* @param spi_id [IN] type #hi_spi_idx,SPI ID。 241* @param read_data [OUT] type #hi_pvoid,RX data pointer.CNcomment:接收数据指针。CNend 242* @param byte_len [IN] type #hi_u32,length of the target data to be received (unit: byte). 243CNcomment:接收数据长度(单位:byte)。CNend 244* 245* @retval #0 Success 246* @retval #Other Failure. For details, see hi_errno.h. 247* @par 依赖: 248* @li hi_spi.h:Describes the SPI APIs.CNcomment:文件用于描述SPI相关接口。CNend 249* @see None 250*/ 251hi_u32 hi_spi_host_read(hi_spi_idx spi_id, hi_pvoid read_data, hi_u32 byte_len); 252 253/** 254* @ingroup iot_spi 255* @brief Full-duplex TX/RX interface for the SPI master mode.CNcomment:SPI主模式全双工收发接口。CNend 256* 257* @par 描述: 258* Full-duplex TX/RX interface for the SPI master mode.CNcomment:SPI主模式全双工收发接口。CNend 259* 260* @attention None. 261* 262* @param spi_id [IN] type #hi_spi_idx,SPI ID。 263* @param write_data [IN] type #hi_pvoid,TX data pointer.CNcomment;发送数据指针。CNend 264* @param read_data [OUT] type #hi_pvoid,RX data pointer.CNcomment:接收数据指针。CNend 265* @param byte_len [IN] type #hi_u32,length of the target data to be received (unit: byte). 266CNcomment:接收数据长度(单位:byte)。CNend 267* 268* @retval #0 Success 269* @retval #Other Failure. For details, see hi_errno.h. 270* @par 依赖: 271* @li hi_spi.h:Describes the SPI APIs.CNcomment:文件用于描述SPI相关接口。CNend 272* @see None 273*/ 274hi_u32 hi_spi_host_writeread(hi_spi_idx spi_id, hi_pvoid write_data, hi_pvoid read_data, hi_u32 byte_len); 275 276 277/** 278* @ingroup iot_spi 279* @brief Configures the SPI parameter.CNcomment:配置SPI参数。CNend 280* 281* @par 描述: 282* Configures the SPI parameter.CNcomment:配置SPI参数。CNend 283* 284* @attention None 285* 286* @param spi_id [IN] type #hi_spi_idx,SPI ID。 287* @param param [IN] type #hi_spi_cfg_basic_info,SPI parameters.CNcomment:SPI参数。CNend 288* 289* @retval #0 Success 290* @retval #Other Failure. For details, see hi_errno.h. 291* @par 依赖: 292* @li hi_spi.h:Describes the SPI APIs.CNcomment:文件用于描述SPI相关接口。CNend 293* @see None 294*/ 295hi_u32 hi_spi_set_basic_info(hi_spi_idx spi_id, const hi_spi_cfg_basic_info *param); 296 297/** 298* @ingroup iot_spi 299* @brief Initializes the SPI module.CNcomment:SPI模块初始化。CNend 300* 301* @par 描述: 302* Initializes the SPI module.CNcomment:SPI模块初始化。CNend 303* 304* @attention To initialize the SPI module, the user needs to perform the initial configuration on the SPI 305* information as follows:CNcomment:对SPI模块初始化,用户需要对SPI如下信息进行初始配置:CNend 306* @li Clear spi_ctrl to 0.CNcomment:spi_ctrl进行清空为0操作。CNend 307* @li Configure the master/slave mode. CNcomment:配置SPI[id]的主/从模式。CNend 308* @li Configure the transfer parameters.CNcomment:配置SPI[id]的传输参数。CNend 309* 310* @param spi_id [IN] type #hi_spi_idx,SPI ID。 311* @param init_param [IN] type #hi_spi_cfg_init_param,initialize as a slave device.CNcomment:是否做为从设备。CNend 312* @param param [IN] type #const hi_spi_cfg_basic_info*,configure parameters.CNcomment:初始化SPI设备参数。CNend 313* 314* @retval #0 Success 315* @retval #Other Failure. For details, see hi_errno.h. 316* @par 依赖: 317* @li hi_spi.h:Describes the SPI APIs.CNcomment:文件用于描述SPI相关接口。CNend 318* @see None 319*/ 320hi_u32 hi_spi_init(hi_spi_idx spi_id, hi_spi_cfg_init_param init_param, const hi_spi_cfg_basic_info *param); 321 322/** 323* @ingroup iot_spi 324* @brief Deinitializes the SPI module.CNcomment:SPI模块去初始化。CNend 325* 326* @par 描述: 327* Deinitializes the SPI module.CNcomment:SPI模块去初始化。CNend 328* 329* @attention None 330* @param spi_id [IN] type #hi_spi_idx,SPI ID。 331* 332* @retval #0 Success 333* @retval #Other Failure. For details, see hi_errno.h. 334* @par 依赖: 335* @li hi_spi.h:Describes the SPI APIs.CNcomment:文件用于描述SPI相关接口。CNend 336* @see None 337 */ 338hi_u32 hi_spi_deinit(hi_spi_idx spi_id); 339 340/** 341* @ingroup iot_spi 342* @brief Set a master spi to use irq mode.CNcomment:设置是否使用中断方式传输数据。CNend 343* 344* @par 描述: 345* Set a master spi to use irq mode.CNcomment:设置是否使用中断方式传输数据。CNend 346* 347* @attention None 348* @param spi_id [IN] type #hi_spi_idx,SPI ID。 349* @param irq_en [IN] type #hi_bool,enable irq. CNcomment:是否使用中断方式。CNend 350* 351* @retval #0 Success 352* @retval #Other Failure. For details, see hi_errno.h. 353* @par 依赖: 354* @li hi_spi.h:Describes the SPI APIs.CNcomment:文件用于描述SPI相关接口。CNend 355* @see None 356*/ 357hi_u32 hi_spi_set_irq_mode(hi_spi_idx id, hi_bool irq_en); 358 359/** 360* @ingroup iot_spi 361* @brief Set a master spi to use dma mode.CNcomment:设置slave 模式下是否使用DMA方式传输数据。CNend 362* 363* @par 描述: 364* Set a master spi to use dma mode.CNcomment:设置slave模式下是否使用DMA方式传输数据。CNend 365* 366* @attention None 367* @param spi_id [IN] type #hi_spi_idx,SPI ID。 368* @param dma_en [IN] type #hi_bool,enable dma. CNcomment:是否使用DMA方式。CNend 369* 370* @retval #0 Success 371* @retval #Other Failure. For details, see hi_errno.h. 372* @par 依赖: 373* @li hi_spi.h:Describes the SPI APIs.CNcomment:文件用于描述SPI相关接口。CNend 374* @see None 375*/ 376hi_u32 hi_spi_set_dma_mode(hi_spi_idx id, hi_bool dma_en); 377 378/** 379* @ingroup iot_spi 380* @brief Register a user to prepare or restore function.CNcomment:注册用户准备/恢复函数。CNend 381* 382* @par 描述: 383* Register a user to prepare or restore function.CNcomment:注册用户准备/恢复函数。CNend 384* 385* @attention None 386* @param spi_id [IN] type #hi_spi_idx,SPI ID。 387* @param prepare_f [IN] type #hi_spi_usr_func,user prepare function.CNcomment:用户准备函数。CNend 388* @param restore_f [IN] type #hi_spi_usr_func,user restore fucntion.CNcomment:用户恢复函数。CNend 389* 390* @retval #0 Success 391* @retval #Other Failure. For details, see hi_errno.h. 392* @par 依赖: 393* @li hi_spi.h:Describes the SPI APIs.CNcomment:文件用于描述SPI相关接口。CNend 394* @see None 395*/ 396hi_u32 hi_spi_register_usr_func(hi_spi_idx id, hi_spi_usr_func prepare_f, hi_spi_usr_func restore_f); 397 398/** 399* @ingroup iot_spi 400* @brief Set whether to loopback test mode.CNcomment:设置是否为回环测试模式。CNend 401* 402* @par 描述: 403* Set whether to loopback test mode.CNcomment:设置是否为回环测试模式。CNend 404* 405* @attention None 406* @param id [IN] type #hi_spi_idx,SPI ID.CNcomment:ID 号。CNend 407* @param lb_en [IN] type #hi_bool,loop back enable.CNcomment:使能回环模式。CNend 408* 409* @retval #0 Success 410* @retval #Other Failure. For details, see hi_errno.h. 411* @par 依赖: 412* @li hi_spi.h:Describes the SPI APIs.CNcomment:文件用于描述SPI相关接口。CNend 413* @see None 414*/ 415hi_u32 hi_spi_set_loop_back_mode(hi_spi_idx id, hi_bool lb_en); 416 417 418#endif 419