• 30-ESP8266 SDK开发基础入门篇--SPI


     这节只是做记录,

    整个的教程呢,重新整理下

    教程有点乱,需要再细分一下

    这节只是做一下我使用其SPI的记录

    还是老样子,看人家LUA源码里面怎么使用的

    注意哈,对于8266 SDK的学习我还是建议大家直接拷贝lua源码里面的直接用

    站在巨人的肩上嘛,,如果你自己写,你很难写到人家那样稳定可靠....别自己瞎研究哈....

    知识永远学不完的,你需要掌握方法!需要学会借力!

    lua源码里面基本上所有的功能都有直接的例子.

    初始化引脚  

    lua语言呢是  spi.setup(id, mode, cpol, cpha, databits, clock_div[, duplex_mode])

    去源码里面看看

     

    /******************************************************************************
     * FunctionName : spi_master_init
     * Description  : SPI master initial function for common byte units transmission
     * Parameters   : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
    *******************************************************************************/
    void spi_master_init(uint8 spi_no, unsigned cpol, unsigned cpha, uint32_t clock_div)
    {
        uint32 regvalue; 
    
        if(spi_no>1)         return; //handle invalid input number
    
        SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_CS_SETUP|SPI_CS_HOLD|SPI_RD_BYTE_ORDER|SPI_WR_BYTE_ORDER);
    
        // set clock polarity (Reference: http://bbs.espressif.com/viewtopic.php?f=49&t=1570)
        // phase is dependent on polarity. See Issue #1161
        if (cpol == 1) {
            SET_PERI_REG_MASK(SPI_PIN(spi_no), SPI_IDLE_EDGE);
        } else {
            CLEAR_PERI_REG_MASK(SPI_PIN(spi_no), SPI_IDLE_EDGE);
        }
        
        //set clock phase
        if (cpha == cpol) {
            // Mode 3: MOSI is set on falling edge of clock
            // Mode 0: MOSI is set on falling edge of clock
            CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_CK_OUT_EDGE);
        } else {
            // Mode 2: MOSI is set on rising edge of clock
            // Mode 1: MOSI is set on rising edge of clock    
            SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_CK_OUT_EDGE);        
        }
    
        CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_FLASH_MODE|SPI_USR_MISO|SPI_USR_ADDR|SPI_USR_COMMAND|SPI_USR_DUMMY);
    
        //clear Dual or Quad lines transmission mode
        CLEAR_PERI_REG_MASK(SPI_CTRL(spi_no), SPI_QIO_MODE|SPI_DIO_MODE|SPI_DOUT_MODE|SPI_QOUT_MODE);
    
        spi_set_clkdiv(spi_no, clock_div);
    
        if(spi_no==SPI){
            PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, 1);//configure io to spi mode
            PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CMD_U, 1);//configure io to spi mode    
            PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA0_U, 1);//configure io to spi mode    
            PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA1_U, 1);//configure io to spi mode    
        }
        else if(spi_no==HSPI){
            PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);//configure io to spi mode
            PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);//configure io to spi mode    
            PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);//configure io to spi mode    
            PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);//configure io to spi mode    
        }
    }

    使用(作为主机)

    spi_master_init(1, 0, 0, 0)

    1:HSPI
    0:时钟信号(CLK引脚)在空闲时是低电平
    0:数据在时钟信号(CLK)的第1个沿开始数据传输
    0:0分频,就是80MHZ



    发送数据

    加点解释

    比如向从机发送0xaa,0x55,0x02,0x01

    spi.send(1,0xaa,0x55,0x02,0x01)

    发送0xaa,0x55,0x02,0x01

    发现没

    不用理会这些,,,再怎么则只是SPI传输数据罢了

    再怎么搞也是SPI通信......SPI_MOSI引脚发送数据的时候,可以判断SPI_MISO引脚的电平接收数据

    给大家个我写的史上最简单的SPI通信函数例子给大家压压惊

    SPI_MOSI : 发送数据引脚

    SPI_MISO : 接收数据引脚

    SPI_CLK   : 时钟引脚

    /**
    * @brief  SPI函数
    * @param  value--发送的数据
    * @param  None
    * @param  None
    * @retval SPI接收的数据
    * @example 
    **/
    unsigned char SPIWriteRead(unsigned char value)
    {
        unsigned char i=0,temp=0;
        SPI_CLK = 0;//进入之前其实是高电平
        if(SPI_MISO)temp|=0x80;//接收数据
        for(i=0;i<8;i++)
        {
            SPI_MOSI=value&(0x80>>i);//准备数据
            SPI_CLK=1;
            SPI_CLK = 0;
            if(i<7)if(SPI_MISO)temp|=0x80>>(i+1);//接收数据
        }
        return temp;
    }
    

    比如向从机发送data = 0xaa;

    第一种: spi_mast_transaction(1, 8, data , 0, 0,0, 0, 0); 

    不要有任何疑问....再怎么着只是SPI发送数据而已

    第二种: spi_mast_transaction(1, 0, 0, 8, data,0, 0, 0); 

    第三种: spi_mast_transaction(1, 0, 0, 0, 0,8, data, 0); 

    那很多人就疑问了

    这不是命令  地址吗....

    哎呀   什么命令地址,就是要发送的数据罢了.

    我有个SPI的从机模块,假设模块地址 0x00 里面有数据,

    想设置里面的数据需要先发0x00,

    让芯片知道设置的地址是0x00地址

    然后发送要设置的数据.

     

    实际上怎么做???

    先用SPI发送个  0x00

    然后再发送设置的数据.

    正常的话应该发送两次SPI数据

    但是呢封装好了

     spi_mast_transaction(1, 0, 0, 8, (0x00),8, (0xff), 0);  假设设置为0xFF

    有些人还问,为啥前面还有命令???

    我有个SPI的从机模块,假设模块设置的地址 0x00 里面有数据,这个地址里面的数据可以设置可以读取

    我想设置怎么办???先发个设置指令 假设是0xAA吧(注:芯片手册会说的)

    然后呢发送0x00 告诉他是设置0x00里面的信息

    然后再发设置的数据

    正常的话应该发送三次SPI数据

    但是呢封装好了

     spi_mast_transaction(1, 8, (0xAA), 8, (0x00),8, (0xff), 0);  假设设置为0xFF

    所有的都封装好了.可以直接把SPI.C 和SPI.H直接拷贝过去用

    不过我发现,RTOS版本的也自带

    那就不用拷贝了...

    不过我发现 初始化里面没有设置引脚

    所以把设置引脚拷贝过来了

        //拷贝的lua里面的配置引脚
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_HSPIQ_MISO);
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_HSPI_CS0);
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_HSPID_MOSI);
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_HSPI_CLK);
    
        spiConfig.mode = SpiMode_Master;//主机
        spiConfig.speed = SpiSpeed_20MHz;//时钟频率
        spiConfig.subMode = SpiSubMode_0;//时钟信号(CLK引脚)在空闲时是低电平
        spiConfig.bitOrder = SpiBitOrder_MSBFirst;//数据在时钟信号(CLK)的第1个沿开始数据传输
    
        SPIInit(SpiNum_HSPI,&spiConfig);//初始化SPI

    发送数据

        u8 data[4] = { 0xaa, 0x55,0x00,0x01};
    
        SpiSend.addr=0;
        SpiSend.addrLen=0;
        SpiSend.cmd=0;
        SpiSend.cmdLen=0;
        SpiSend.data=&data;
        SpiSend.dataLen=4;
    
        SPIMasterSendData(SpiNum_HSPI,&data);

     

    这节只是做下记录..............

    等我新板子到了,我便测试整改教程,把lua和SDK同时开进,源码还是公开.

    Android 和 C# 单独拿出来讲解,不再混到一块了.

  • 相关阅读:
    [中文] 以太坊(Ethereum )白皮书
    走近比特币:一个故事看懂“区块链”
    MAC下redis的安装和配置
    mysql查询优化
    mac上用VMWare虚拟机装Linux-Ubuntu
    rest-framework框架
    浅谈设计模式
    [BZOJ3786]星系探索(欧拉序+非旋treap)
    [SDOI2017]遗忘的集合(多项式ln+生成函数+莫比乌斯反演)
    [LuoguP4841]城市规划(多项式ln+生成函数)
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/11897470.html
Copyright © 2020-2023  润新知