2、SPI协议栈代码
1)spi.c
/**************************************************************************************************
Filename: spi.c
Description: spi slave driver
Date: 2015-06-17
Author: 甜甜的大香瓜
**************************************************************************************************/
//******************************************************************************
// INCLUDES
//******************************************************************************
#include <ioCC2541.h>
#include "spi.h"
#include "OSAL.h"
#include "hal_mcu.h"
#include <string.h>
//******************************************************************************
// MACROS
//******************************************************************************
//引脚 usart1 spi —— alt.2
#define SPI_CS P1_4
#define SPI_CLK P1_5
#define SPI_MOSI P1_6
#define SPI_MISO P1_7
//寄存器
#define UxCSR U1CSR
#define UxUCR U1UCR
#define UxDBUF U1DBUF
#define UxBAUD U1BAUD
#define UxGCR U1GCR
#define PxSEL P1SEL
#define HAL_UART_PERCFG_BIT 0x02 // USART1 on P1, Alt-2; so set this bit.
#define HAL_UART_PRIPO 0x40 // USART1 priority over UART0.
#define HAL_UART_Px_SEL_S 0xF0 // Peripheral I/O Select for Slave: SO/SI/CLK/CSn.
#define HAL_UART_Px_SEL_M 0xE0 // Peripheral I/O Select for Master: MI/MO/CLK.
// UxCSR - USART Control and Status Register.
#define CSR_MODE 0x80
#define CSR_RE 0x40
#define CSR_SLAVE 0x20
#define CSR_FE 0x10
#define CSR_ERR 0x08
#define CSR_RX_BYTE 0x04
#define CSR_TX_BYTE 0x02
#define CSR_ACTIVE 0x01
// UxUCR - USART UART Control Register.
#define UCR_FLUSH 0x80
#define UCR_FLOW 0x40
#define UCR_D9 0x20
#define UCR_BIT9 0x10
#define UCR_PARITY 0x08
#define UCR_SPB 0x04
#define UCR_STOP 0x02
#define UCR_START 0x01
//其他
#define uint8 unsigned char
#define uint16 unsigned short
//协议相关
#define SPI_MAX_PACKET_LEN 39
#define SPI_MAX_DATA_LEN 35
#define SPI_SOF 0x7E // Start-of-frame delimiter for SPI transport.
#define SPI_EOF 0x7F // End-of-frame delimiter for SPI transport.
#define Head_CTRL 1
#define Head_COMMAND 0
#define Head(x) ((p_spi_protocol_data->Head >> x) & 0x01)
#define COMMAND_RF 1
#define COMMAND_BLE 0
#define SPI_LEN_INCR(LEN) st ( \
if (++(LEN) >= (SPI_MAX_DATA_LEN - 1)) \
{ \
(LEN) = 0; \
} \
)
#define DATA_RESET(); {spiRxSte = spiRxSteSOF; spiRxIndex = 0;}
//******************************************************************************
// GLOBAL VARIABLES
//******************************************************************************
//
typedef enum{
RESPONSE_RECEIVING = 0xF4, //正在接收
RESPONSE_RECEIVED = 0xF6, //接收完毕
RESPONSE_RESEND = 0xF7 //请求重发
}SPI_RESPONSE_BYTE;
//
typedef enum{
SPI_MALLOC_DATA_RIGHT,
SPI_MALLOC_DATA_ERROR,
}SPI_MALLOC_DATA_STATUS;
//协议包
typedef enum{
spiRxSteSOF,
spiRxSteLen,
spiRxSteData
} spiRxSte_t;
//SPI接收状态
typedef enum{
SPI_RxStatus_Receiving,
SPI_RxStatus_Received,
SPI_RxStatus_Right,
SPI_RxStatus_Error
} SPI_RXSTATUS;
//协议中的核心数据
typedef struct{
uint8 Length;
uint8 Head;
uint8 Sequence;
uint8 Binary[32];
}SPI_PROTOCOL_DATA;
SPI_PROTOCOL_DATA *p_spi_protocol_data;
//接收数据要的全局变量
spiRxSte_t spiRxSte = spiRxSteSOF;
uint16 spiRxFcs = 0; //校验和
uint8 spiRxIndex = 0; //指向接收核心数据缓冲区的第几位
uint8 spi_rx[SPI_MAX_PACKET_LEN] = {0}; //接收缓冲区
SPI_RXSTATUS spi_rx_status = SPI_RxStatus_Receiving;
static volatile uint8 check_time = 0; //用于计数主机发送F4的次数,如果过多就超时
//******************************************************************************
// LOCAL FUNCTIONS
//******************************************************************************
static void SPI_Response_Byte(SPI_RESPONSE_BYTE tx);
static SPI_MALLOC_DATA_STATUS SPI_Malloc_DATA(void);
static uint8 SPI_Packet_Receive(void);
static SPI_RXSTATUS SPI_Rx_Resolution(void);
static SPI_RXSTATUS SPI_Status_Judge(uint8 status);
static void SPI_Status_Deal(SPI_RXSTATUS status);
|