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>) 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 == ) {
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, );//configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CMD_U, );//configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA0_U, );//configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA1_U, );//configure io to spi mode
}
else if(spi_no==HSPI){
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, );//configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, );//configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, );//configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, );//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[] = { 0xaa, 0x55,0x00,0x01}; SpiSend.addr=;
SpiSend.addrLen=;
SpiSend.cmd=;
SpiSend.cmdLen=;
SpiSend.data=&data;
SpiSend.dataLen=; SPIMasterSendData(SpiNum_HSPI,&data);
这节只是做下记录..............
等我新板子到了,我便测试整改教程,把lua和SDK同时开进,源码还是公开.
Android 和 C# 单独拿出来讲解,不再混到一块了.
30-ESP8266 SDK开发基础入门篇--SPI的更多相关文章
- 1-ESP8266 SDK开发基础入门篇--开发环境搭建
因为今天终于做好了自己的另一块工控板,所以我就开始写基础公开篇的内容,希望自己小小的努力能够帮到大家 自己做的另一块板子 https://www.cnblogs.com/yangfengwu/cate ...
- 25-ESP8266 SDK开发基础入门篇--控制WIFI连接路由器
https://www.cnblogs.com/yangfengwu/p/11324411.html 说个事情,现在SDK的版本已经出到3.0了,但是我还是使用2.0 如果只是为了学习研究 选择3 ...
- 16-ESP8266 SDK开发基础入门篇--TCP 服务器 非RTOS运行版,串口透传(串口回调函数处理版)
https://www.cnblogs.com/yangfengwu/p/11105466.html 其实官方给的RTOS的版本就是在原先非RTOS版本上增加的 https://www.cnblogs ...
- 10-ESP8266 SDK开发基础入门篇--上位机通过串口控制ESP8266灯亮灭
https://www.cnblogs.com/yangfengwu/p/11087618.html 其实这一节就是对上三节的综合测试 https://www.cnblogs.com/yangfeng ...
- 26-ESP8266 SDK开发基础入门篇--编写WIFI模块 SmartConfig/Airkiss 一键配网
https://www.cnblogs.com/yangfengwu/p/11427504.html SmartConfig/Airkiss 配网需要APP/微信公众号,这节大家先使用我做好的APP/ ...
- 18-ESP8266 SDK开发基础入门篇--TCP 服务器 RTOS版,串口透传,TCP客户端控制LED
https://www.cnblogs.com/yangfengwu/p/11112015.html 先规定一下协议 aa 55 02 01 F1 4C 控制LED点亮 F1 4C为CRC高位和低位 ...
- 12-ESP8266 SDK开发基础入门篇--PWM,呼吸灯
https://www.cnblogs.com/yangfengwu/p/11094085.html PWM其实没有什么,就是看着官方给的API,,,然后就是用呗 对了,其实对于RTOS SDK版本的 ...
- 29-ESP8266 SDK开发基础入门篇--编写TCP 客户端程序(Lwip RAW模式,非RTOS版,精简入门)
https://www.cnblogs.com/yangfengwu/p/11456667.html 由于上一节的源码长时间以后会自动断开,所以再做这一版非RTOS版的,咱直接用lua源码里面别人写的 ...
- 3-ESP8266 SDK开发基础入门篇--点亮一个灯
https://www.cnblogs.com/yangfengwu/p/11072834.html 所有的源码 https://gitee.com/yang456/Learn8266SDKDevel ...
随机推荐
- python网络爬虫(2)——scrapy框架的基础使用
这里写一下爬虫大概的步骤,主要是自己巩固一下知识,顺便复习一下. 一,网络爬虫的步骤 1,创建一个工程 scrapy startproject 工程名称 创建好工程后,目录结构大概如下: 其中: sc ...
- pytest_demo_实战1
1.根目录配置 pytest.ini [pytest] addopts = -p no:warnings 2.更改运行手势,系统配置 file -> setting -> Tools -& ...
- 如何防止短信API接口遍历
短信API接口在web中得到越来越多的应用,如用户注册,登录,密码重置等业务模块都会使用手机验证码进行身份验证.一般情况下,我们会采用这样的安全策略,将短信发送频率限制在正常的业务流控范围内,比如,一 ...
- SQL Server使用加密连接SSL/TLS (转载)
说明 应用程序通过未加密的通道与数据库服务器通信, 这可能会造成重大的安全风险.在这种情况下, 攻击者可以修改用户输入的数据, 甚至对数据库服务器执行任意 SQL 命令.例如,当您使用以下连接字符串时 ...
- Vue 项目中遇到的跨域问题及解决方法
原文:https://www.jb51.net/article/137278.htm 问题描述 前端 vue 框架,跨域问题后台加这段代码 header("Access-Control-Al ...
- 剑指Offer_栈的压入序列是否有对应的弹出序列
题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序. 如:假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是 ...
- Power BI连接Oracle的注意事项
开始 Power BI 连接Oracle需要安装对应位数的ODAC,这个过程中有几个点要注意. ODAC 12c.x 版本(32.64),在安装时要将GAC的勾搭上.否则打开Power BI时会提示找 ...
- Haskell路线
@ 知乎 @ <I wish i have learned haskell> ———— 包括: Ranks, forall, Monad/CPS, monadic parser, FFI ...
- 开发--Deepin系统安装
开发|Deepin系统安装 在18小时前,我刚刚萌生了一个将我的笔记本换成linux系统.在18小时后的现在,在我各种试错之后,笔记本已经开始跑起linux了.在科技的时代,只要是想法,都可以试一试. ...
- web攻击日志分析之新手指
0x00 前言 现实中可能会经常出现web日志当中出现一些被攻击的迹象,比如针对你的一个站点的URL进行SQL注入测试等等,这时候需要你从日志当中分析到底是个什么情况,如果非常严重的话,可能需要调查取 ...