15、STM32F103C8T6 硬件SPI

软件控制SPI片选

void MySPI_W_SS(uint8_t bitValue)
{
	GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)bitValue);
}

一、硬件SPI初始化

1、开对应时钟

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

2、配置GPIO

	//初始化GPIO口:其中SCK和MOSI 是由硬件外设控制的输出信号,配置为复用推挽
	//MISO是硬件外设的输入信号,配置为上拉输入,SS是软件控制的输出信号,配置为通用推挽输出
	GPIO_InitTypeDef GPIO_InitStructure1;
	GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure1);
	
	GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure1);
	
	GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
	GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure1);

3、配置SPI外设

    SPI_InitTypeDef SPI_InitSturcture;
	
	//设置SPI时钟分频:这里的时钟是SPI所挂载的总线时钟
	SPI_InitSturcture.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
	
	//配置SPI模式
	//时钟相位:SPI_CPHA_1Edge:(CPHA == 0)第一个边沿开始采样;SPI_CPHA_2Edge:(CPHA == 1)第二个边沿开始采样
	SPI_InitSturcture.SPI_CPHA = SPI_CPHA_1Edge;
	//时钟极性:High:CPOL = 1; Low:CPOL = 0;
	SPI_InitSturcture.SPI_CPOL = SPI_CPOL_Low;
	
	SPI_InitSturcture.SPI_CRCPolynomial = 7;
	
	//8位数据帧
	SPI_InitSturcture.SPI_DataSize = SPI_DataSize_8b;
	
	//SPI_Direction_2Lines_FullDuplex	双线全双工
	//SPI_Direction_2Lines_RxOnly    	双线只接收模式
	//SPI_Direction_1Line_Rx         	单线半双工接收模式
	//SPI_Direction_1Line_Tx         	单线半双工发送模式
	//全双工
	SPI_InitSturcture.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
	
	//高位先行
	SPI_InitSturcture.SPI_FirstBit = SPI_FirstBit_MSB;
	
	//主模式
	SPI_InitSturcture.SPI_Mode = SPI_Mode_Master;
	
	//软件设置NSS引脚
	SPI_InitSturcture.SPI_NSS = SPI_NSS_Soft;
	SPI_Init(SPI1, &SPI_InitSturcture);

4、开关控制

	SPI_Cmd(SPI1, ENABLE);
	
    //默认SS输出高电平,不选择从机
	MySPI_W_SS(1); 

二、起始信号

void MySPI_Start(void)
{
	MySPI_W_SS(0);
}

三、停止信号

void MySPI_Stop(void)
{
	MySPI_W_SS(1);
}

四、交换字节

//SPI交换一个字节:W25Q64芯片支持模式0,和模式3,这里使用模式0
//这里的 RXNE 和 TXE 不需要 自己清除
uint8_t MySPI_SwapByte(uint8_t byteSend)
{
	//检测发送寄存器是否为空
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) != SET);
	
	//软件写入数据寄存器 至 SPI_DR,之后byteSend 自动转入 移位寄存器,一旦移位寄存器有数据,时序波形就会自动产生
	SPI_I2S_SendData(SPI1, byteSend);
	
	//等待RXNE出现,当RXNE 为1, 表示接收到一个字节,同时表示发送时序产生完成
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) != SET);
	
	//读取DR
	return SPI_I2S_ReceiveData(SPI1);
}

其他部分同上一章

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值