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

英文网站如何做渠道销售怎么找客户

英文网站如何做,渠道销售怎么找客户,完整网站模板,怎么做网站在里面填字版权声明#xff1a;本文为博主原创文章#xff0c;允许转载#xff0c;但希望标注转载来源。 https://blog.csdn.net/qq_38410730/article/details/80312357IIC的基本介绍 IIC的简介 IIC#xff08;Inter#xff0d;Integrated Circuit#xff09;总线是一种由PHILIPS公…版权声明本文为博主原创文章允许转载但希望标注转载来源。 https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 IIC的简介 IICInterIntegrated Circuit总线是一种由PHILIPS公司在80年代开发的两线式串行总线用于连接微控制器及其外围设备。它是半双工通信方式。 IIC总线最主要的优点是其简单性和有效性。由于接口直接在组件之上因此IIC总线占用的空间非常小减少了电路板的空间和芯片管脚的数量降低了互联成本。总线的长度可高达25英尺并且能够以10Kbps的最大传输速率支持40个组件。IIC总线的另一个优点是它支持多主控(multimastering) 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然在任何时间点上只能有一个主控。 IIC串行总线一般有两根信号线一根是双向的数据线SDA另一根是时钟线SCL其时钟信号是由主控器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上各设备的时钟线SCL接到总线的SCL上。对于并联在一条总线上的每个IC都有唯一的地址。 一般情况下数据线SDA和时钟线SCL都是处于上拉电阻状态。因为在总线空闲状态时这两根线一般被上面所接的上拉电阻拉高保持着高电平。 STM32的IIC接口 目前绝大多数的MCU都附带IIC总线接口STM32也不例外。但是在本文中我们不使用STM32的硬件IIC来读取24C02而是通过软件的方式来模拟。 原因是因为STM32的硬件IIC非常复杂更重要的是它并不稳定故不推荐使用。   IIC协议 IIC总线在传输数据的过程中一共有三种类型信号分别为开始信号、结束信号和应答信号。这些信号中起始信号是必需的结束信号和应答信号都可以不要。同时我们还要介绍其空闲状态、数据的有效性、数据传输。 先来看一下IIC总线的时序图 这可能会比较复杂可以先看一份简化了的时序图 空闲状态 当IIC总线的数据线SDA和时钟线SCL两条信号线同时处于高电平时规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态即释放总线由两条信号线各自的上拉电阻把电平拉高。  起始信号与停止信号 起始信号当时钟线SCL为高期间数据线SDA由高到低的跳变启动信号是一种电平跳变时序信号而不是一个电平信号停止信号当时钟线SCL为高期间数据线SDA由低到高的跳变停止信号也是一种电平跳变时序信号而不是一个电平信号。 应答信号 发送器每发送一个字节8个bit就在时钟脉冲9期间释放数据线由接收器反馈一个应答信号。  应答信号为低电平时规定为有效应答位ACK简称应答位表示接收器已经成功地接收了该字节应答信号为高电平时规定为非应答位NACK一般表示接收器接收该字节没有成功。  对于反馈有效应答位ACK的要求是接收器在第9个时钟脉冲之前的低电平期间将数据线SDA拉低并且确保在该时钟的高电平期间为稳定的低电平。 如果接收器是主控器则在它收到最后一个字节后发送一个NACK信号以通知被控发送器结束数据发送并释放数据线SDA以便主控接收器发送一个停止信号P。 数据有效性 IIC总线进行数据传送时时钟信号为高电平期间数据线上的数据必须保持稳定只有在时钟线上的信号为低电平期间数据线上的高电平或低电平状态才允许变化。  即数据在时钟线SCL的上升沿到来之前就需准备好。并在在下降沿到来之前必须稳定。 数据的传达 在IIC总线上传送的每一位数据都有一个时钟脉冲相对应或同步控制即在SCL串行时钟的配合下在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。 延时时间   IIC总线的数据传送 IIC总线上的每一个设备都可以作为主设备或者从设备而且每一个设备都会对应一个唯一的地址地址通过物理接地或者拉高主从设备之间就通过这个地址来确定与哪个器件进行通信在通常的应用中我们把CPU带I2C总线接口的模块作为主设备把挂接在总线上的其他设备都作为从设备。 也就是说主设备在传输有效数据之前要先指定从设备的地址地址指定的过程和上面数据传输的过程一样只不过大多数从设备的地址是7位的然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向0表示主设备向从设备写数据1表示主设备向从设备读数据。 主设备往从设备中写数据。数据传输格式如下 淡蓝色部分表示数据由主机向从机传送粉红色部分则表示数据由从机向主机传送。 写用0来表示低电平读用1来表示高电平。 主设备从从设备中读数据。数据传输格式如下 在从机产生响应时主机从发送变成接收从机从接收变成发送。之后数据由从机发送主机接收每个应答由主机产生时钟信号仍由主机产生。若主机要终止本次传输则发送一个非应答信号接着主机产生停止条件。  主设备往从设备中写数据然后重启起始条件紧接着从从设备中读取数据或者是主设备从从设备中读数据然后重启起始条件紧接着主设备往从设备中写数据。数据传输格式如下 在多主的通信系统中总线上有多个节点它们都有自己的寻址地址可以作为从节点被别的节点访问同时它们都可以作为主节点向其它的节点发送控制字节和传送数据。但是如果有两个或两个以上的节点都向总线上发送启动信号并开始传送数据这样就形成了冲突。要解决这种冲突就要进行仲裁的判决这就是I2C总线上的仲裁。 I2C总线上的仲裁分两部分SCL线的同步和SDA线的仲裁。 这部分就暂时不介绍了想要了解可以参考链接浅谈I2C总线或I2C总线协议图解。   IIC底层驱动程序分析 现拟采用PB6、PB7来模拟IIC时序其中PB6为时钟线PB7为数据线。 首先进行一些必要的宏定义 //IO方向设置 #define SDA_IN() {GPIOB-CRL0X0FFFFFFF;GPIOB-CRL|(u32)828;} #define SDA_OUT() {GPIOB-CRL0X0FFFFFFF;GPIOB-CRL|(u32)328;} //IO操作函数 #define IIC_SCL PBout(6) //SCL #define IIC_SDA PBout(7) //SDA #define READ_SDA PBin(7) //输入SDA //IIC所有操作函数 void IIC_Init(void); //初始化IIC的IO口 void IIC_Start(void); //发送IIC开始信号 void IIC_Stop(void); //发送IIC停止信号 void IIC_Send_Byte(u8 txd); //IIC发送一个字节 u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节 u8 IIC_Wait_Ack(void); //IIC等待ACK信号 void IIC_Ack(void); //IIC发送ACK信号 void IIC_NAck(void); //IIC不发送ACK信号 由于IIC是半双工通信方式因而数据线SDA可能会数据输入也可能是数据输出需要定义IIC_SDA来进行输出、READ_SDA来进行输入与此同时就要对IO口进行模式配置SDA_IN()和SDA_OUT()。 而时钟线SCL一直是输出的所以就没有数据线SDA麻烦了。 //初始化IIC void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟 GPIO_InitStructure.GPIO_Pin GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP ; //推挽输出 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高空闲状态 } //产生IIC起始信号 void IIC_Start(void) { SDA_OUT(); //sda线输出 IIC_SDA1; IIC_SCL1; delay_us(4); IIC_SDA0;    //START:when CLK is high,DATA change form high to low delay_us(4); IIC_SCL0;    //钳住I2C总线准备发送或接收数据 } //产生IIC停止信号 void IIC_Stop(void) { SDA_OUT();    //sda线输出 IIC_SCL0; IIC_SDA0;    //STOP:when CLK is high DATA change form low to high delay_us(4); IIC_SCL1; IIC_SDA1;    //发送I2C总线结束信号 delay_us(4); } //发送数据后等待应答信号到来 //返回值1接收应答失败IIC直接退出 // 0接收应答成功什么都不做 u8 IIC_Wait_Ack(void) { u8 ucErrTime0; SDA_IN(); //SDA设置为输入 IIC_SDA1;delay_us(1); IIC_SCL1;delay_us(1); while(READ_SDA) { ucErrTime; if(ucErrTime250) { IIC_Stop(); return 1; } } IIC_SCL0;    //时钟输出0 return 0; } //产生ACK应答 void IIC_Ack(void) { IIC_SCL0; SDA_OUT(); IIC_SDA0; delay_us(2); IIC_SCL1; delay_us(2); IIC_SCL0; } //不产生ACK应答 void IIC_NAck(void) { IIC_SCL0; SDA_OUT(); IIC_SDA1; delay_us(2); IIC_SCL1; delay_us(2); IIC_SCL0; } //IIC发送一个字节 //返回从机有无应答 //1有应答 //0无应答 void IIC_Send_Byte(u8 txd) { u8 t; SDA_OUT(); IIC_SCL0;            //拉低时钟开始数据传输 for(t0;t8;t) { //IIC_SDA(txd0x80)7; if((txd0x80)7) IIC_SDA1; else IIC_SDA0; txd1; delay_us(2);     //对TEA5767这三个延时都是必须的 IIC_SCL1; delay_us(2); IIC_SCL0; delay_us(2); } } //读1个字节ack1时发送ACKack0发送nACK u8 IIC_Read_Byte(unsigned char ack) { unsigned char i,receive0; SDA_IN();        //SDA设置为输入 for(i0;i8;i ) { IIC_SCL0; delay_us(2); IIC_SCL1; receive1; if(READ_SDA)receive; delay_us(1); } if (!ack) IIC_NAck();        //发送nACK else IIC_Ack();         //发送ACK return receive; } 这里是通过普通IO口PB6、PB7来模拟IIC时序的程序其实本质上都是严格按照IIC的时序图进行的认真读仔细对比应该是没有什么困难的。 就提一下IIC_Read_Byte()函数这个函数的参数表示读取一个字节之后需要给对方应答信号或非应答信号。   普通IO口模拟IIC时序读取24C02 24C02芯片介绍 EEPROM (Electrically Erasable Programmable read only memory)带电可擦可编程只读存储器——一种掉电后数据不丢失的存储芯片。  24Cxx芯片是EEPROM芯片的一种它是基于IIC总线的存储器件遵循二线制协议由于其具有接口方便体积小数据掉电不丢失等特点在仪器仪表及工业自动化控制中得到大量的应用。24Cxx在电路的作用主要是在掉电的情况下保存数据。 本文使用的是24C02芯片总容量是2k个bit256个字节。这里芯片名称里的02代表着总容量。 24C02芯片的引脚分布和具体的作用见下图   24C02芯片的引脚说明引脚名称说明A0-A2地址输入线SDA数据线SCL时钟线WP写保护GND、VCC提供电源 下图是本文中24C02和STM32的引脚连接图 从图中可以看出A0、A1、A2都为0。 对于并联在一条IIC总线上的每个IC都有唯一的地址。那么看一下从器件地址可以看出对于不同大小的24Cxx具有不同的从器件地址。由于24C02为2k容量也就是说只需要参考图中第一行的内容 根据图中的内容如果是写24C02的时候从器件地址为101000000xA0读24C02的时候从器件地址为101000010xA1。 24C02芯片的时序图 这部分的内容应结合上文I2C总线的数据传送的内容一起理解。 24C02字节写时序 对24C02芯片进行写字节操作的时候步骤如下 开始位后面紧跟从器件地址位0xA0等待应答这是为了在IIC总线上确定24C02的从地址位置确定操作24C02的地址等待应答也就是将字节写入到24C02中256个字节中的位置确定需要写入24C02芯片的字节等待应答停止位。24C02字节读时序 对24C02芯片进行读字节操作的时候步骤如下 开始位后面紧跟从器件地址位0xA0等待应答这是为了在IIC总线上确定24C02的从地址位置确定操作24C02的地址等待应答也就是从24C02中256个字节中读取字节的位置再次开始位后面紧跟从器件地址位0xA1等待应答获取从24C02芯片中读取的字节发出非应答信号停止位。读取24C02芯片程序 #define AT24C01 127 #define AT24C02 255 #define AT24C04 511 #define AT24C08 1023 #define AT24C16 2047 #define AT24C32 4095 #define AT24C64 8191 #define AT24C128 16383 #define AT24C256 32767 //Mini STM32开发板使用的是24c02所以定义EE_TYPE为AT24C02 #define EE_TYPE AT24C02 //初始化IIC接口 void AT24CXX_Init(void) { IIC_Init(); } //在AT24CXX指定地址读出一个数据 //ReadAddr:开始读数的地址 //返回值 :读到的数据 u8 AT24CXX_ReadOneByte(u16 ReadAddr) { u8 temp0; IIC_Start(); if(EE_TYPEAT24C16)            //为了兼容24Cxx中其他的版本 { IIC_Send_Byte(0XA0); //发送写命令 IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr8);    //发送高地址 IIC_Wait_Ack(); }else     IIC_Send_Byte(0XA0((ReadAddr/256)1)); //发送器件地址0XA0,写数据 IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr%256); //发送低地址 IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(0XA1); //进入接收模式 IIC_Wait_Ack(); tempIIC_Read_Byte(0);     //读一个字节非应答信号信号 IIC_Stop();        //产生一个停止条件 return temp; } //在AT24CXX指定地址写入一个数据 //WriteAddr :写入数据的目的地址 //DataToWrite:要写入的数据 void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite) { IIC_Start(); if(EE_TYPEAT24C16) { IIC_Send_Byte(0XA0); //发送写命令 IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr8);    //发送高地址 }else { IIC_Send_Byte(0XA0((WriteAddr/256)1)); //发送器件地址0XA0,写数据 } IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr%256); //发送低地址 IIC_Wait_Ack(); IIC_Send_Byte(DataToWrite); //发送字节 IIC_Wait_Ack(); IIC_Stop();    //产生一个停止条件 delay_ms(10); } //在AT24CXX里面的指定地址开始写入长度为Len的数据 //该函数用于写入16bit或者32bit的数据. //WriteAddr :开始写入的地址 //DataToWrite:数据数组首地址 //Len :要写入数据的长度2,4 void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len) { u8 t; for(t0;tLen;t) { AT24CXX_WriteOneByte(WriteAddrt,(DataToWrite(8*t))0xff); } } //在AT24CXX里面的指定地址开始读出长度为Len的数据 //该函数用于读出16bit或者32bit的数据. //ReadAddr :开始读出的地址 //返回值 :数据 //Len :要读出数据的长度2,4 u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len) { u8 t; u32 temp0; for(t0;tLen;t) { temp8; tempAT24CXX_ReadOneByte(ReadAddrLen-t-1); } return temp; } //检查AT24CXX是否正常 //这里用了24XX的最后一个地址(255)来存储标志字. //如果用其他24C系列,这个地址要修改 //返回1:检测失败 //返回0:检测成功 u8 AT24CXX_Check(void) { u8 temp; tempAT24CXX_ReadOneByte(255);//避免每次开机都写AT24CXX if(temp0X55)return 0; else//排除第一次初始化的情况 { AT24CXX_WriteOneByte(255,0X55); tempAT24CXX_ReadOneByte(255); if(temp0X55)return 0; } return 1; } //在AT24CXX里面的指定地址开始读出指定个数的数据 //ReadAddr :开始读出的地址 对24c02为0~255 //pBuffer :数据数组首地址 //NumToRead:要读出数据的个数 void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead) { while(NumToRead) { *pBufferAT24CXX_ReadOneByte(ReadAddr); NumToRead--; } } //在AT24CXX里面的指定地址开始写入指定个数的数据 //WriteAddr :开始写入的地址 对24c02为0~255 //pBuffer :数据数组首地址 //NumToWrite:要写入数据的个数 void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite) { while(NumToWrite--) { AT24CXX_WriteOneByte(WriteAddr,*pBuffer); WriteAddr; pBuffer; } } //要写入到24c02的字符串数组 const u8 TEXT_Buffer[]{WarShipSTM32 IIC TEST}; #define SIZE sizeof(TEXT_Buffer) int main(void) { u8 key; u16 i0; u8 datatemp[SIZE]; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组22位抢占优先级2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //初始化与LED连接的硬件接口 LCD_Init(); //初始化LCD KEY_Init(); //按键初始化 AT24CXX_Init(); //IIC初始化 POINT_COLORRED;//设置字体为红色 LCD_ShowString(30,50,200,16,16,WarShip STM32); LCD_ShowString(30,70,200,16,16,IIC TEST); LCD_ShowString(30,90,200,16,16,ATOMALIENTEK); LCD_ShowString(30,110,200,16,16,2015/1/15); LCD_ShowString(30,130,200,16,16,KEY1:Write KEY0:Read); //显示提示信息 while(AT24CXX_Check())//检测不到24c02 { LCD_ShowString(30,150,200,16,16,24C02 Check Failed!); delay_ms(500); LCD_ShowString(30,150,200,16,16,Please Check! ); delay_ms(500); LED0!LED0;//DS0闪烁 } LCD_ShowString(30,150,200,16,16,24C02 Ready!); POINT_COLORBLUE;//设置字体为蓝色 while(1) { keyKEY_Scan(0); if(keyKEY1_PRES)//KEY_UP按下,写入24C02 { LCD_Fill(0,170,239,319,WHITE);//清除半屏 LCD_ShowString(30,170,200,16,16,Start Write 24C02....); AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE); LCD_ShowString(30,170,200,16,16,24C02 Write Finished!);//提示传送完成 } if(keyKEY0_PRES)//KEY1按下,读取字符串并显示 { LCD_ShowString(30,170,200,16,16,Start Read 24C02.... ); AT24CXX_Read(0,datatemp,SIZE); LCD_ShowString(30,170,200,16,16,The Data Readed Is: );//提示传送完成 LCD_ShowString(30,190,200,16,16,datatemp);//显示读到的字符串 } i; delay_ms(10); if(i20) { LED0!LED0;//提示系统正在运行 i0; } } }   IIC总结 进行数据传送时在SCL为高电平期间SDA线上电平必须保持稳定只有SCL为低时才允许SDA线上电平改变状态。并且每个字节传送时都是高位在前对于应答信号ACK0时为有效应答位说明从机已经成功接收到该字节若为1则说明接受不成功如果从机需要延迟下一个数据字节开始传送的时间可以通过把SCL电平拉低并保持来强制主机进入等待状态主机完成一次通信后还想继续占用总线在进行一次通信而又不释放总线就要利用重启动信号。它既作为前一次数据传输的结束又作为后一次传输的开始总线冲突时按“低电平优先”的仲裁原则把总线判给在数据线上先发送低电平的主器件在特殊情况下若需禁止所有发生在I2C总线上的通信可采用封锁或关闭总线具体操作为在总线上的任一器件将SCL锁定在低电平即可SDA仲裁和SCL时钟同步处理过程没有先后关系而是同时进行的。   转载于:https://www.cnblogs.com/CodeWorkerLiMing/p/10830459.html
http://www.pierceye.com/news/700739/

相关文章:

  • 怎么知道网站是php什么是网站推广?
  • 温州在线课堂番禺网站建设优化
  • php怎么做网站快大都会app下载最新版本
  • 麻城网站建设公司网络推广公司挣钱吗
  • t型布局网站的样子自己做的网站如何上传
  • 排版设计模板网站百度搜索下载安装
  • 网站页面建设需要ps吗网站建设结单 优帮云
  • 网站建设对我有什么好处网站首页被k 做跳转
  • 美辰网站建设网站建设公司转型做什
  • 创意网站界面怎么查注册公司的名字可不可以用
  • 微友说是做网站维护让帮忙投注中小企业经营管理培训班
  • 网站开发宣传标语虚拟币挖矿网站开发
  • wordpress是否免费网站移动端seo
  • 加盟网站建设服务极简风格 wordpress
  • phpcms v9 网站模板seo优化的技巧
  • 域名备案网站要不要关7k7k网页游戏
  • 虚拟主机发布网站吗汕头建站平台
  • wap站是什么意思啊阿里云建设网站的步骤
  • 网站备案 异地可以做视频的网站
  • 淘宝网站c 设计怎么做安卓手机做网站
  • 嘉兴做网站建设的公司电商网名大全
  • 欢迎访问中国建设银行网站密码重置wordpress wp_parse_args
  • 普通电脑可以做网站服务器吗找人做网站需要什么条件
  • 长沙公司网站的建设网站图片尺寸
  • 高端网站定制费用是多少php网站建设制作
  • 广州营销型网站建设费用wordpress最新版下载
  • 洛阳网站设计公司xiamiplayer for wordpress
  • 做网站模版形象墙logo墙设计图
  • 视频网站怎么做防盗链好的装修效果图网站
  • 个人音乐分享网站源码移动网站建设的前景