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# 单独拿出来讲解,不再混到一块了.