×
单片机 > 其他资讯 > 详情

STM32小白入门(第11天)-------SPI协议

发布时间:2020-06-19 发布时间:
|

一、定义


二、单机与多机通信


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;

}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
不要贪便宜.教你一招认清SSD耐久度时间