美文网首页
第九集 ESP8266 与STM32 SPI通信

第九集 ESP8266 与STM32 SPI通信

作者: 招风小妖怪 | 来源:发表于2019-07-17 00:10 被阅读0次
引脚接口

信号引脚 nodemcu 其他裸机
CLK D5 GPIO14
CS D8 GPIO15
MOSI D7 GPIO13
MISO D6 GPIO12
主要函数

函数名 功能
spi.setup() 初始化spi
spi.send() 发送数据
spi.recv() 接收数据

这里只列出了常用的函数,其他的请参考官方文档飞机票

spi.setup()

spi.setup(1, spi.MASTER, spi.CPOL_HIGH, spi.CPHA_HIGH, 8, 8)

  • id spi还是Hspi,一般写1
  • mode 设置主从模式
    • spi.MASTER 主模式
    • spi.SLAVE 从模式不能设置
  • cpol时钟空闲状态设置
    • spi.CPOL_LOW
    • spi.CPOL_HIGH
  • cpha 时钟相位设置
    • spi.CPHA_LOW
    • spi.CPHA_HIGH
  • databits 数据比特网 1 - 32 位
  • clock_div 时钟分频, f(SPI) = 80 MHz / clock_div, (1~8)
  • duplex_mode duplex mode
    • spi.HALFDUPLEX (默认)半双工
    • spi.FULLDUPLEX 全双工
spi.send()

spi.send(id, data1,data2,...)发送数据

spi.recv()

spi.recv(id, size,default_data)接收数据

ESP8266的程序测试

spi.setup(1, spi.MASTER, spi.CPOL_HIGH, spi.CPHA_HIGH, 8, 8)

while true do

k = spi.recv(1,1,0xaa)
print(k:byte(1))--打印为数字print(k)打印的是ASCII码
tmr.wdclr()
tmr.delay(500000)

end
STM32

我用的STM32F407ZT6,正点原子(探索者)的库文件
其他板子可以参考


void SPI1_Init(void)//初始化
{    
  GPIO_InitTypeDef  GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;
    
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
  //GPIOFA4,5,6,7初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//PA4~7复用功能输出   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化


  
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource4,GPIO_AF_SPI1); //复用为 SPI1   CS
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1); //复用为 SPI1 SCK
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1); //复用为 SPI1 MISO
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1); //复用为 SPI1 MOSI

    //这里只针对SPI口初始化
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
    SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;        //设置SPI工作模式:设置为从SPI
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;       //设置SPI的数据大小:SPI发送接收8位帧结构
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//串行同步时钟的第二个跳变沿(上升或下降)数据被采样
    SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;       //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:硬件控制
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;        //定义波特率预分频的值:波特率预分频值为256
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI_InitStructure.SPI_CRCPolynomial = 7;    //CRC值计算的多项式
    SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
    SPI_Cmd(SPI1, ENABLE); //使能SPI外设

    //SPI1_ReadWriteByte(0xff);//启动传输        
} 
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)//接收和发送函数
{                    
 
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空  
    
    SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个byte  数据
        
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte  
 
    return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据 
            
}
int main(void)
{ 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    delay_init(168);     //初始化延时函数
    uart_init(115200);  //初始化串口波特率为115200
    LED_Init();                 //初始化LED 
    SPI1_Init();
    while(1)
    {       
        LED0=~LED0;
        u8 k;
        k = SPI1_ReadWriteByte('Q');    
        printf("%x\r\n",k);
    }       
}

效果


image.png

进阶例子

stm32

u8 i=0;
    while(1)
    {   i++;
        LED0=~LED0;
        u8 k;
        if(KEY0==1)
        {
            GPIO_ResetBits(GPIOE,GPIO_Pin_4);
            k = SPI1_ReadWriteByte(i);  
            //printf("%x\r\n",k);
        }
    } 

esp8266

spi.setup(1, spi.MASTER, spi.CPOL_HIGH, spi.CPHA_HIGH, 8, 8)
pin = 4
gpio.mode(pin,gpio.INT,gpio.PULLUP) 


wifi.setmode(wifi.STATION)
cfg={}
cfg.ssid="ADC"
cfg.pwd="1234567890"
wifi.sta.config(cfg)
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function()
  if wifi.sta.getip()== nil then
    print("IP unavaiable, Waiting...")
  else
    tmr.stop(1)
    print("Config done, IP is "..wifi.sta.getip())
    cle()
    
  end
end)
function cle()
    sk=net.createConnection(net.TCP,0)
    sk:connect(8888,"192.168.137.1")
    sk:on("connection",  function()    
        gpio.trig(pin,"low",function(level)
            if level == 0 then 
                k = spi.recv(1,1,0xaa)
                sk:send(k:byte(1))  
                gpio.write(pin, gpio.HIGH)
            end 
        end)   
                    
    end )
    
end

相关文章

网友评论

      本文标题:第九集 ESP8266 与STM32 SPI通信

      本文链接:https://www.haomeiwen.com/subject/xdixlctx.html