一、定义
二、单机与多机通信
1、多机通信
2、单机通信
三、通信细节与过程
2、硬件原理图
uint16_t w25qxx_read_id(void){
uint16_t id=0;//片选引脚拉低W25QXX_SS=0;//发送0x90SPI1_SendByte(0x90);//发送24bit的地址,全为0SPI1_SendByte(0x00);SPI1_SendByte(0x00);SPI1_SendByte(0x00);//读取厂商id,参数可以为任意参数id = SPI1_SendByte(0xFF)<<8;//读取设备idid|= SPI1_SendByte(0xFF);//片选引脚拉高W25QXX_SS=1;return id;}
三、模拟SPI
在有些情况下没有硬件SPI的支持,只能通过IO口来模拟SPI时序图,参考代码如下:
uint8_t SPI1_SendByte(uint8_t byte)
{
uint32_t i=0;
uint8_t d=0;
for(i=0; i<8; i++)
{
//MSB,最高有效位发送数据
if(byte & (1<
W25QXX_MOSI =1;
else
W25QXX_MOSI =0;
//设置SCLK引脚为低电平,这个时候,从机会开始读取MOSI引脚电平
W25QXX_SCLK=0;
delay_us(2);
//由于是同步事件,这个时候,从机通过MISO引脚已经输出数据给主机,主机可以读取MISO引脚电平值
if(W25QXX_MISO)
d|=1<
//设置SCLK引脚为高电平,告诉从机,我已经读物MISO引脚电平完毕
W25QXX_SCLK=1;
delay_us(2);
}
return d;
}
//SPI3初始化
void STM32_SPI3_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*!< Enable GPIO clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
//SPI3 pins: MOSI=PC6 Reset PC11
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
//SPI3 pins: SCK=PD7 MISO=PD6
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_Init(GPIOD,&GPIO_InitStructure);
/* 配置MISO=PC8引脚为输入模式,*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);
MFRC522_NSS = 1; //片选置高电平
/*!< Deselect the FLASH: Chip Select high ,由于M4芯片还没有真正开始跟从机工作,先让片选引脚为高电平*/
MFRC522_SCLK = 1; //启动SP3
}
//发与收
u8 SPI3_Send(u8 byte)
{
uint32_t i=0;
uint8_t d=0;
for(i=0; i<8; i++)
{
if(byte & (1<
MFRC522_MOSI=1;
else
MFRC522_MOSI=0;
//设置SCLK引脚为低电平,这个时候,从机会开始读取MOSI引脚电平
MFRC522_SCLK=0;
Delay1_us(1);
//由于是同步事件,这个时候,从机通过MISO引脚已经输出数据给主机,主机可以读取MISO引脚电平值
if(MFRC522_MISO)
d|=1<
//设置SCLK引脚为高电平,告诉从机,我已经读取MISO引脚电平完毕
MFRC522_SCLK=1;
Delay1_us(1);
}
return d;
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』