📄 spi.c
字号:
/********************************************************************************************************/
#include "config.h"
#define SPI_CPHA_TWO 0x08
#define SPI_CPHA_ONE 0x00
#define SPI_CPOL_LOW 0x10
#define SPI_CPOL_HIGH 0x00
#define SPI_MSTR_MASTER 0x20
#define SPI_MSTR_SLAVE 0x00
#define SPI_LSBF_BIT0 0x40
#define SPI_LSBF_BIT7 0x00
#define SPI_SPIE_EN 0x80
#define SPI_SPIE_DISABLE 0x00
#ifndef SPI0_MOD
#define SPI0_MOD SPI_CPHA_ONE | SPI_CPOL_LOW | SPI_LSBF_BIT7
#endif
#ifndef SPI1_MOD
#define SPI1_MOD SPI_CPHA_ONE | SPI_CPOL_HIGH | SPI_LSBF_BIT7 //注意CH432和AT45DB021的相位模式不对
#endif
/*********************************************************************************************************/
uint8 SPI0Init(uint8 Fdiv)
{
PINSEL0 = (PINSEL0 & 0xffff00ff) | 0x5500; /* 选择管脚为SPI0 */
SPI_SPCCR = Fdiv & 0xfe; /* 分频值 */
SPI_SPCR = 0x20 | SPI0_MOD; /* 主机、不允许中断 */
return TRUE;
}
/*********************************************************************************************************/
uint8 SPI1Init(uint8 Fdiv)
{
PINSEL1 = (PINSEL1 & 0xfffffc03) | 0x02a8; /* 选择管脚为SPI1 */
SSPCR0 = (0x01 << 8) | // SCR 设置SPI时钟分频
(0x00 << 7) | // CPHA 时钟输出相位,仅SPI模式有效
(0x00 << 6) | // CPOL 时钟输出极性,仅SPI模式有效
(0x00 << 4) | // FRF 帧格式 00=SPI,01=SSI,10=Microwire,11=保留
(0x07 << 0); // DSS 数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位
SSPCR1 = (0x00 << 3) | // SOD 从机输出禁能,1=禁止,0=允许
(0x00 << 2) | // MS 主从选择,0=主机,1=从机
(0x01 << 1) | // SSE SSP使能,1=允许SSP与其它设备通信
(0x00 << 0); // LBM 回写模式
SSPCPSR = 0x04; // PCLK分频值
SSPIMSC = 0x07; // 中断屏蔽寄存器
SSPICR = 0x03; // 中断清除寄存器
PINSEL1 = (PINSEL1 & 0xfffffffc) | 0x00000001; //设置p0.16为EINT0
EXTMODE |= 0x01; // 设置EINT0为边沿触发
EXTPOLAR &= 0xfe; // 设置EINT0为下降沿有效
return TRUE;
}
/*********************************************************************************************************/
static uint8 Read_F(uint8 adr)
{
uint8 temp;
temp = adr << 2;
temp &= 0xfd;
return temp;
}
/*********************************************************************************************************/
static uint8 Write_F(uint8 adr)
{
uint8 temp;
temp = adr << 2;
temp |= 0x02;
return temp;
}
/*********************************************************************************************************/
uint8 SPI1_Oper(uint8 data)
{
SSPDR = data;
while( (SSPSR & 0x01) == 0 ); // 等待TFE置位,即发送FIFO空
return(SSPDR);
}
/*********************************************************************************************************/
uint8 SPIRW(uint8 *Rt, uint8 Data)
{
SPI_SPDR = Data;
while((S0PSR & 0x80) == 0x00);
*Rt = S0PDR;
return TRUE;
}
/*********************************************************************************************************/
void CH432T_SPI_Write(uint8 addr, uint8 data)
{
uint8 i;
IO1CLR |= UARTCS; /* 设置P1.25输出为0*/
for (i = 0x00; i < 8; i++);
SPI1_Oper(Write_F(addr));
SPI1_Oper(data);
for (i = 0x00; i < 32; i++);
IO1SET |= UARTCS; /* 设置P1.25输出为1*/
for (i = 0x00; i < 8; i++);
}
/*********************************************************************************************************/
uint8 CH432T_SPI_Read(uint8 addr)
{
uint8 spi_data, i;
IO1CLR |= UARTCS; /* 设置P1.25输出为0*/
for (i = 0x00; i < 8; i++);
SPI1_Oper(Read_F(addr));
//spi_data = SPI1_Oper(0x00);
SPI1_Oper(0x00);
for (i = 0x00; i < 32; i++);
spi_data =SSPDR;
IO1SET |= UARTCS; /* 设置P1.25输出为1*/
for (i = 0x00; i < 8; i++);
return(spi_data);
}
/*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -