void Driver_SPION(void)
{
//开启时钟
CLK_PCKENR1 |= SETBIT1;
//控制寄存器CR1先清零
SPI_CR1 = 0x00;
//配置通信波特率1Mbps
SPI_CR1 &= 0xC7;
//配置时钟的相位与极性
//空闲状态时,SCK保持低电平
SPI_CR1 &= CLRBIT1;
//数据采样从第一个时钟边沿开始
SPI_CR1 &= CLRBIT0;
//定义帧格式
//通信时,串行移位,高位在前,低位在后
SPI_CR1 &= CLRBIT7;
//设置SPI工作模式
//NSS引脚软件管理
SPI_CR2 |= SETBIT1;
SPI_CR2 |= SETBIT0;
//主设备选择
SPI_CR1 |= SETBIT2;
//端口配置为快速摆率
PC_DDR |= SETBIT5;
PC_CR1 |= SETBIT5;
PC_CR2 |= SETBIT5;
PC_DDR |= SETBIT6;
PC_CR1 |= SETBIT6;
PC_CR2 |= SETBIT6;
PC_CR1 |= SETBIT7;
//使能SPI
SPI_CR1 |= SETBIT6;
}
/***************************************************************************
* Function: Driver_SPISend
* Object: SPI发送数据
* 输入: &DataBuff 发送数据缓存的头指针;DataLen 发送数据的个数;
* 输出: 无
* 备注: 主模式 四线连接 硬件SPI sck mosi misi
/***************************************************************************/
void Driver_SPISend(u8 *DataBuff,u16 DataLen)
{
u8 temp;
//执行发送
for(;DataLen>0;DataBuff++,DataLen--)
{
//等待发送
while(!(SPI_SR&CHSBIT1));
//发送数据
SPI_DR = *DataBuff;
}
//等待总线空闲
temp = SPI_DR;
while(SPI_SR&CHSBIT7);
}
/***************************************************************************
* Function: Driver_SPIReceive
* Object: SPI接收数据
* 输入: &DataBuff 接收数据缓存的头指针;DataLen 接收数据的个数;
* 输出: 无
* 备注: 主模式 四线连接 硬件SPI sck mosi misi
/***************************************************************************/
void Driver_SPIReceive(u8 *DataBuff,u16 DataLen)
{
//执行接收
for(;DataLen>0;DataBuff++,DataLen--)
{
//等待接收
while(!(SPI_SR&CHSBIT0));
//接收数据
*DataBuff = SPI_DR;
}
//等待总线空闲
while(SPI_SR&CHSBIT7);
}
//程序从这里开始运行
main()
{
//初始化硬件SPI
Driver_SPION();
//可以开始进行外设SPI接口通信控制
//发送
//Driver_SPISend...
//接收
//Driver_SPIReceive...
//接收
//OK
while (1);
}