当前位置: 首页 > news >正文

石家庄网页定制开发长沙优化推广外包

石家庄网页定制开发,长沙优化推广外包,有哪些网页制作的软件,吉林省吉林市有几个区本文主要讲解两部分内容#xff0c;不做任何转发#xff0c;仅个人学习记录: 一. Arduino 与 SPI 结合使用 #xff1a; 二. SPI 深层理解 有价值的几个好的参考#xff1a; 1. 中文版#xff1a; https://blog.csdn.net/xxxxxx91116/article/details/42620413 这版本适…本文主要讲解两部分内容不做任何转发仅个人学习记录: 一. Arduino 与 SPI 结合使用  二. SPI 深层理解 有价值的几个好的参考 1. 中文版 https://blog.csdn.net/xxxxxx91116/article/details/42620413  这版本适合比较容易理解大概 细节翻译还是要去英文版https://www.arduino.cc/en/Tutorial/SPIEEPROM 2 .https://www.cnblogs.com/adylee/p/5399742.html  以及 https://blog.csdn.net/weixin_40117614/article/details/84070130其中2.2传输数据步骤如下 mode似乎弄混了mode0与mode2在第一次采样之前已发送1bit 而mode1和mode3则是正常的发送再采样有待考证         一. Arduino 与 SPI 结合使用  1.串行外围设备接口入门Introduction to the Serial Peripheral Interface Serial Peripheral Interface (SPI)是一种同步串行数据传输协议用于近距离时微控制器(Microcontrollers)如Arduino与其他外围设备的快速通信。他也可以用于2个微控制器的通讯。 SPI通讯通常有一个主设备通常是Microcontrollers用于控制外围设备。通常会有3种线路通用于各类设备的方法。 -Master In Slave OutMISO- Slave line用于Slave向Master发送数据 -Master Out Slave InMOSI- Master line用于Master向Slave发送数据 -Serial ClockSCK- 时钟脉冲主设备用于同步数据传输 -Slave Select pin- 分配给所有的设备用于enable/disable指定的设备同时用于避免由于线路忙导致的错误传输。 SPI最大的问题在于它的标准太不严格了这导致各个设备在实现它的时候都有一些不同这就意味着当我们在编写接口代码的时候必须仔细阅读设备数据参数。通常来说有编号为0-3的3种传输模式不是4种么这些模式控制数据是在时钟信号的高电平还是低电平传入或传出以及在高或低电平时时钟无效。 所有的SPI设置都由Arduino SPI控制寄存器SPCR来决定。这个寄存器就是微控制器内存的一个字节它是可读写的。寄存器提供的服务通常有3类控制、数据和状态。 控制寄存器SPCR编码设置控制多种微控制器的功能。通常控制寄存器中的一个位影响某个特定的设置比如速度和极性这个是啥 数据寄存器SPDR仅仅hold住了一个字节。比如SPI数据寄存器hold住了要发往MOSI线的一个字节或者这个数据是要从MISO线传入的。 状态寄存器SPSR根据多种微控制器的条件改变其状态。比如SPI状态寄存器SPSR的第七位被设置为1表示有数据从SPI传入或传出。 SPI控制寄存器SPCR共有8位每一个都控制了一种特定的SPI设置。 SPIE置为1时表示enable SPI的中断 SPE置为1时表示enable SPI DORD发送数据时设置为1表示最低有效位0表示最高有效位。请各自脑补最低有效位和最高有效位。。。 MSTR设置为1表示Arduino为master模式0为slave模式 CPOL设置为1时数据时钟在高时无效设置为0时在低时无效 CPHA设置为1时时钟低电平时是Samples data样本数据0时时钟高电平是Sampledata SPR1和SPR0设置SPI的速度00是最快的4MHz11是最慢的250KHz 这些意味着当对一个新的SPI设备编码的时候我们需要注意一些事情并根据如下设置SPCR - 数据传入是最高有效位(MSB)还是最低有效位LSB - 数据时钟无效是在高还是低 - samples是在时钟脉冲上升沿还是下降沿 - SPI 运行的速度是多少 你还要感受一下feel一下你的芯片在你设置好之后需要暂停多久才能继续Let‘s go 2.串行EEPROM简介 AT25HP512是一个65536字节串行EEPROM。它支持SPI的模式0-3在10MHz5V的环境下运行同时也可以在1.8v的低速下运行。他的内存被组织成512个页每个页有128字节。他每次只能写入128字节但是可以同时读出1-128字节的数据这个设备同时提供了多种程度的写保护但这里不涉及这个部分。 enable这个设备只需要让片选信号CS为低即可。指令使用8位的opcodes来发送同时在时钟上升沿传入数据大概使用10微秒写入1个页的数据所以在每个EEPROM的的写程序后面都应该等待10ms。 3.面包板的准备 将AT25HP512芯片插入面包板EEPROM的3,7,8引脚接到5V引脚4接地。 红色的线接5VGND线是黑色 EERPOM的引脚1连接Arduino的引脚10Slave 片选EEPROM的引脚2连接Arduino的引脚12Master In Slave Out - MISOEEPROM的引脚5连接Arduino的引脚11Master Out Slave In - MOSI同时EEPROM的引脚6连接Arduino的引脚13串口时钟 SCK。 4.Arduino SPI 编程 现在我们要编写能让Arduino和EEPROM进行SPI通信的代码了。在启动代码中这个程序填充128字节或者一个EEPROM页。在main loop中他将数据读出来每次读一个字节并通过串口打印出来。我们下面用一小节来过一下代码。 第一步是启动我们的预处理指令其实就是#define啦预处理指令是在真正的编译开始前处理的。他们以#开头并且不以分号;结尾。反正前面一段就是说我们接下来要开始使用#define了。 下面定义在我们的SPI通讯中要用到的pins引脚DATAOUT, DATAIN, SPICLOCK和SLAVESELECT。然后定义EEPROM的控制指令opcodes 接下来分配程序会用到的全局变量。我们将用char buffer[128]来保存要传输到EEPROM的数据 首先我们初始化我们的串口连接设置我们的input和output模式并设置SLAVESELECT线为高时开始。这个设置可以使设备暂时失效这样可以防止由于线路噪声引起的传输错误。 现在我们设置SPI控制寄存器SPCR为二进制数据01010000.在控制寄存器中每一位的设置都表示不同的功能。第8位关闭SPI中断第七位enable SPI第六位选择数据传输是最高有效位有线第五位设置Arduino为master模式第四位设置数据时钟低时无效第三位代表SPI在数据时钟的上升沿阶段抽样数据第二位和第一位设置SPI和系统的通讯速度/4有4个级别。当设置了控制寄存后我们接下来从垃圾回收变量中读取SPI的状态寄存器SPSR和数据寄存器SPDR以清除以前运行的脏数据 这里我们用数字来填充要发送的数组并向EEPROM写入一个enable指令。这个enable指令必须在任何一个写指令之前完成。为了发送这个指令我们将SLAVESELECT线置为低enable这个设备后使用spi_transfer函数发送指令。注意到我们使用了程序开始定义的WREN opcode。最后我们设置SLAVESELECT线为高来释放它。 在短暂的delay(10)之后我们将SLAVESELECT线置为低再次选中EEPROM设备。我们发送一个写指令来告诉EEPROM我们将发送数据到内存中。首先发送16位也就是2个字节地址来开始最高有效位。接下来发送buffer中的128字节数据一个字节接着一个字节不需要pause暂停。最后我们设置SLAVESELECT引脚为高来释放设备同时等待一段时间以保证EEPROM写入数据 我们在setup函数结束时通过串口发送hi来表示setup结束。 在我们的主函数loop中我们每次从EEPROM中读取一个字节并通过串口将它打印出来。为了可读性我们增加一个打印以及等待。每一次loop我们都增加EEPROM的一个地址去读当地址增加到128后我们重新回到0开始读原因很简单因为开始我们只写入了128字节数据 fill_buffer函数仅仅将我们的数组用0-127这128个数字来填充。这个函数很容易就可以改写为你应用程序需要的数据 spi_transfer函数将要传出的数据放入数据传输寄存器然后就开始SPI传输了哈。可以通过SPI状态寄存器SPSR的某个位SPIF来查看数据传输是否结束了。关于位掩码bit mask可以参考这里http://www.arduino.cc/en/Tutorial/。最后返回写入EEPROM的数据。   read_eeprom函数允许我们从EEPROM中读入数据首先设置SLAVESELECT为低来enable设备。接下来送入一个读指定接下来送入要读的16位地址最高有效位有限。接下来我们发送一个假数据到EEPROM中以将数据传出。最后我们在读入一个字节后再次设置SLAVESELECT线为高来释放设备并返回数据如果我们想要一次读入多个数据那么当我们重复dataspi_transfer(0XFF)时需要将SLAVESELECT一直设置为低这样来回128次后读出整个页的数据     为了方便大家CTRLc、  CTRLv下面是整个手册的源码   #define DATAOUT 11//MOSI #define DATAIN 12//MISO #define SPICLOCK 13//sck #define SLAVESELECT 10//ss //opcodes #define WREN 6 #define WRDI 4 #define RDSR 5 #define WRSR 1 #define READ 3 #define WRITE 2 byte eeprom_output_data; byte eeprom_input_data0; byte clr; int address0; //data buffer char buffer [128]; void fill_buffer() { for (int I0;I128;I) { buffer[I]I; } } char spi_transfer(volatile char data) { SPDR data; // Start the transmission while (!(SPSR (1SPIF))) // Wait the end of the transmission { }; return SPDR; // return the received byte } void setup() { Serial.begin(9600); pinMode(DATAOUT, OUTPUT); pinMode(DATAIN, INPUT); pinMode(SPICLOCK,OUTPUT); pinMode(SLAVESELECT,OUTPUT); digitalWrite(SLAVESELECT,HIGH); //disable device // SPCR 01010000 //interrupt disabled,spi enabled,msb 1st,master,clk low when idle, //sample on leading edge of clk,system clock/4 rate (fastest) SPCR (1SPE)|(1MSTR); clrSPSR; clrSPDR; delay(10); //fill buffer with data fill_buffer(); //fill eeprom w/ buffer digitalWrite(SLAVESELECT,LOW); spi_transfer(WREN); //write enable digitalWrite(SLAVESELECT,HIGH); delay(10); digitalWrite(SLAVESELECT,LOW); spi_transfer(WRITE); //write instruction address0; spi_transfer((char)(address8)); //send MSByte address first spi_transfer((char)(address)); //send LSByte address //write 128 bytes for (int I0;I128;I) { spi_transfer(buffer[I]); //write data byte } digitalWrite(SLAVESELECT,HIGH); //release chip //wait for eeprom to finish writing delay(3000); Serial.print(h,BYTE); Serial.print(i,BYTE); Serial.print(\n,BYTE);//debug delay(1000); } byte read_eeprom(int EEPROM_address) { //READ EEPROM int data; digitalWrite(SLAVESELECT,LOW); spi_transfer(READ); //transmit read opcode spi_transfer((char)(EEPROM_address8)); //send MSByte address first spi_transfer((char)(EEPROM_address)); //send LSByte address data spi_transfer(0xFF); //get data byte digitalWrite(SLAVESELECT,HIGH); //release chip, signal end transfer return data; } void loop() { eeprom_output_data read_eeprom(address); Serial.print(eeprom_output_data,DEC); Serial.print(\n,BYTE); address; if (address 128) address 0; delay(500); //pause for readability }  总结 1.这里主要以内存器EEPROM为主 而且个人感觉这里的SPI控制进入到Arduino的开发版 大体的方向对很多Arduino——SPI控制实用但毕竟只是一个例子下面一节将讲述SPI最底层的东西。 2.如果只是简单的读写Arduino 中是有SPI.h头文件和cpp 也是大家可以研究的一个方向现在记忆留心还是spi.transfer用法。   二. SPI 深层理解 SPI是英语Serial Peripheral Interface的缩写顾名思义就是串行外围设备接口。SPI是一种高速的全双工同步的通信总线并且在芯片的管脚上只占用四根线节约了芯片的管脚同时为PCB的布局上节省空间提供方便正是出于这种简单易用的特性现在越来越多的芯片集成了这种通信协议。 SPI是一个环形总线结构由ss(cs)、sck、sdi、sdo构成其时序其实很简单主要是在sck的控制下两个双向移位寄存器进行数据交换。 上升沿发送、下降沿接收、高位先发送。 上升沿到来的时候sdo上的电平将被发送到从设备的寄存器中。 下降沿到来的时候sdi上的电平将被接收到主设备的寄存器中。假设主机和从机初始化就绪并且主机的sbuff0xaa (10101010)从机的sbuff0x55 (01010101)下面将分步对spi的8个时钟周期的数据情况演示一遍(假设上升沿发送数据)。--------------------------------------------------- 脉冲      主机sbuff 从机sbuff sdi sdo --------------------------------------------------- 0 00-0   10101010 01010101 0 0 --------------------------------------------------- 1 0--1   0101010x 10101011 0 1 1 1--0   01010100 10101011 0 1 --------------------------------------------------- 2 0--1   1010100x 01010110 1 0 2 1--0   10101001 01010110 1 0 --------------------------------------------------- 3 0--1   0101001x 10101101 0 1 3 1--0   01010010 10101101 0 1 --------------------------------------------------- 4 0--1   1010010x 01011010 1 0 4 1--0   10100101 01011010 1 0 --------------------------------------------------- 5 0--1   0100101x 10110101 0 1 5 1--0   01001010 10110101 0 1 --------------------------------------------------- 6 0--1   1001010x 01101010 1 0 6 1--0   10010101 01101010 1 0 --------------------------------------------------- 7 0--1   0010101x 11010101 0 1 7 1--0   00101010 11010101 0 1 --------------------------------------------------- 8 0--1   0101010x 10101010 1 0 8 1--0   01010101 10101010 1 0 ---------------------------------------------------这样就完成了两个寄存器8位的交换上面的0--1表示上升沿、1--0表示下降沿sdi、 sdo相对于主机而言的。根据以上分析一个完整的传送周期是16位即两个字节因为首先主机要发送命令过去然后从机根据主机的名准备数据主机在下一个8位时钟周期才把数据读回来。  SPI总线是Motorola公司推出的三线同步接口同步串行3线方式进行通信:一条时钟线SCK一条数据输入线MOSI一条数据输出线MISO;用于 CPU与各种外围器件进行全双工、同步串行通讯。 SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。 SPI总线有四种工作方式(SP0, SP1, SP2, SP3)其中使用的最为广泛的是SPI0和SPI3方式。 SPI模块为了和外设进行数据交换根据外设工作要求其输出串行同步时钟极性和相位可以进行配置时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL0串行同步时钟的空闲状态为低电平如果CPOL1串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果 CPHA0在串行同步时钟的第一个跳变沿(上升或下降)数据被采样如果CPHA1在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。 SPI主模块和与之通信的外设音时钟相位和极性应该一致。     SPI时序图详解-SPI接口在模式0下输出第一位数据的时刻 SPI接口在模式0下输出第一位数据的时刻SPI接口有四种不同的数据传输时序取决于CPOL和CPHL这两位的组合。图1中表现了这四种时序 时序与CPOL、CPHL的关系也可以从图中看出。 CPOL时钟极性和CPHA时钟相位意义 CPOL0表示当SCLK0时处于空闲态所以有效状态就是SCLK处于高电平时 CPOL1表示当SCLK1时处于空闲态所以有效状态就是SCLK处于低电平时 CPHA0表示数据采样是在第1个边沿数据发送在第2个边沿   CPHA1表示数据采样是在第2个边沿数据发送在第1个边沿 通过CPOL和CPHA来控制我们主设备的通信模式发送和接收设备需要根据实际情况分析 发送设备 ≠ 主设备Mode0CPOL0CPHA0SCLK0空闲当SCLK由低到高跳变上升沿(接收设备)进行数据的读取当SCLK由高到低跳变下降沿(发送设备)进行数据的发送Mode1CPOL0CPHA1SCLK0空闲当SCLK由高到低跳变下降沿(接收设备)进行数据的读取当SCLK由低到高跳变上升沿(发送设备)进行数据的发送Mode2CPOL1CPHA0SCLK1空闲当SCLK由高到低跳变下降沿(接收设备)进行数据的读取当SCLK由低到高跳变上升沿(发送设备)进行数据的发送Mode3CPOL1CPHA1SCLK1空闲当SCLK由低到高跳变上升沿(接收设备)进行数据的读取当SCLK由高到低跳变下降沿(发送设备)进行数据的发送---------------------     图1     CPOL是用来决定SCK时钟信号空闲时的电平CPOL0空闲电平为低电平CPOL1时 空闲电平为高电平。CPHA是用来决定采样时刻的CPHA0在每个周期的第一个时钟沿采样 CPHA1在每个周期的第二个时钟沿采样。   由于我使用的器件工作在模式0这种时序CPOL0CPHA0所以将图1简化为图2 只关注模式0的时序。 图2 我们来关注SCK的第一个时钟周期在时钟的前沿采样数据上升沿第一个时钟沿 在时钟的后沿输出数据下降沿第二个时钟沿。首先来看主器件主器件的输出口MOSI输出的数据bit1 在时钟的前沿被从器件采样那主器件是在何时刻输出bit1的呢bit1的输出时刻实际上在SCK信号有效以前 比 SCK的上升沿还要早半个时钟周期。bit1的输出时刻与SSEL信号没有关系。再来看从器件 主器件的输入口MISO同样是在时钟的前沿采样从器件输出的bit1的那从器件又是在何时刻输出bit1的呢。 从器件是在SSEL信号有效后立即输出bit1尽管此时SCK信号还没有起效。关于上面的主器件 和从器件输出bit1位的时刻可以从图3、4中得到验证。 图3 注意图3中CS信号有效后低电平有效注意CS下降沿后发生的情况故意用延时程序 延时了一段时间之后再向数据寄存器写入了要发送的数据来观察主器件输出bit1的情况MOSI。 可以看出bit1值为1是在SCK信号有效之前的半个时钟周期的时刻开始输出的与CS信号无关 到了SCK的第一个时钟周期的上升沿正好被从器件采样。 图4 图4中注意看CS和MISO信号。我们可以看出CS信号有效后从器件立刻输出了bit1值为1。   通常我们进行的spi操作都是16位的。图5记录了第一个字节和第二个字节间的相互衔接的过程。 第一个字节的最后一位在SCK的上升沿被采样随后的SCK下降沿从器件就输出了第二个字节的第一位。         SPI总线协议介绍接口定义,传输时序   一、技术性能 SPI接口是Motorola 首先提出的全双工三线同步串行外围接口采用主从模式Master Slave架构支持多slave模式应用一般仅支持单Master。 时钟由Master控制在时钟移位脉冲下数据按位传输高位在前低位在后MSB firstSPI接口有2根单向数据线为全双工通信目前应用中的数据速率可达几Mbps的水平。------------------------------------------------------- 二、接口定义 SPI接口共有4根信号线分别是设备选择线、时钟线、串行输出数据线、串行输入数据线。   1MOSI主器件数据输出从器件数据输入 2MISO主器件数据输入从器件数据输出 3SCLK 时钟信号由主器件产生 4/SS从器件使能信号由主器件控制------------------------------------------------------- 三、内部结构  四、传输时序 SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位在主器件产生的从器件使能信号和移位脉冲下按位传输高位在前低位在后。如下图所示在SCLK的下降沿上数据改变上升沿一位数据被存入移位寄存器。 SPI接口没有指定的流控制没有应答机制确认是否接收到数据。 谢谢      转载于:https://www.cnblogs.com/MCSFX/p/10805878.html
http://www.pierceye.com/news/590994/

相关文章:

  • 中山快速做网站服务wordpress建站ftp
  • 做酒类直供网站行吗网站seo检测报告
  • 南昌建站费用网站建设出错1004
  • 十堰做网站的公司阿里巴巴外贸网站论坛
  • 品牌网站建设代理网站建设公司易下拉软件
  • 移动网站模板响应式网站开发教程pdf
  • 怎么设计网站内容小程序seo帝搜软件sem880官网
  • 十堰秦楚网 十堰新闻门户网站wordpress 点赞 开启
  • 做外贸网站需要注意些什么手续安阳吧贴吧
  • 国外申请域名的网站百度标记号码认证平台
  • 专门做淘宝代运营的网站支付建设网站的费用什么科目
  • 天津企业设计网站建设建个网站做外贸
  • 申请永久网站空间wordpress论坛采集
  • 网站如何做竞价佛山新网站建设机构
  • 网站建设费可以一次性冲费用吗学校门户网站作用
  • 手机上怎么制作网站音乐网站如何建立
  • 新乡企业网站建设公司寮步东莞网站建设
  • wordpress中国网站排名如何加入广告联盟赚钱
  • 济宁网站建设培训学校wordpress导入表单
  • 做农产品交易网站阿里云已备案域名购买
  • 免费建站网站一级大录像不卡谁给我一个企业邮箱认证
  • 中国做网站东台做网站公司
  • 建设数据库网站需要哪些设备wordpress多功能主题 cosy
  • 苏州市郭巷建设局网站一家专门做鞋子的网站
  • 光明网站建设网站建设成果
  • 商业网站建设举例宝塔做两个网站6
  • 网站优化排名分享隐迅推前端开发入门培训
  • 曲周县建设局网站东莞保安公司电话
  • 合肥商城网站建设多少钱wordpress页面代码怎么改
  • 前期做网站宣传费用怎样做账企业网站建设的劣势