Exynos4412 裸机开发 —— IIC总线

前言:

        I2C(Inter-Integrated Circuit)总线(也称 IIC 或 I2C) 是有PHILIPS公司开发的两线式串行总线,用于连接微控制器及外围设备,是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少、控制方式简单、器件封装形式小、通信速率较高等优点。

 

  一、综述
        Exynos4412精简指令集微处理器支持4个IIC总线控制器。为了能使连接在总线上的主和从设备之间传输数据,专用的数据线SDA和时钟信号线SCL被使用,他们都是双向的。
        如果工作在多主机的IIC总线模式,多个4412处理器将从从机那接收数据或发送数据给从机。在IIC总线上的主机端4412会启动或终止一个数据传输。4412的IIC总线控制器会用一个标准的IIC总线仲裁机制去实现多主机和多从机传输数据。
        通过控制如下寄存器以实现IIC总线上的多主机操作:
控制寄存器:                  I2CCON
状态寄存器:                   I2CSTAT
Tx/Rx数据偏移寄存器:   I2CDS
地址寄存器:                   I2CADD

        如果I2C总线空闲,那么SCL和SDA信号线将都为高电平。在SCL为高电平期间,如果SDA有由高到低电平的跳变,那么将启动一个起始信号,如果SDA有由低到高电平的跳变,将启动一个结束信号。
      主机端的设备总是提供起始和停止信号的一端。在起始信号被发出后,一个数据字节的前7位被当作地址通过SDA线被传输。这个地制值决定了总线上的主设备将要选择那个从设备作为传输对象,bit8决定传输数据的方向(是读还是写)。
       I2C总线上的数据(即在SDA上传输的数据)都是以8位字节传输的,在总线上传输操作的过程中,对发送或接收的数据字节数是没有限制的。I2C总线上的主/从设备发送数据总是以一个数据的最高位开始传输(即MSB方式),传输完一个字节后,应答信号紧接其后。

二、I2C总线接口特性
      9个通道多主、从I2C总线接口。其中8个通道作为普通接口(即I2C0、I2C1....),1个通道作为HDMI的专用接口。
      7位地址模式。
      串行,8位单向或双向的数据传输。
      在标准模式中,每秒最多可以传输100k位,即12.5kB的数据量。
      在快速模式中,每秒最多可以传输400k位,即50kB的数据量。
      支持主机端发送、接收,从机端发送、接收操作。
      支持中断和查询方式。

三、框图

    

    从上图可以看出,4412提供4个寄存器来完成所有的IIC操作。SDA线上的数据从IICDS寄存器经过移位寄存器发出,或通过移位寄存器传入IICDS寄器;IICADD寄存器中保存4412当做从机时的地址;IICCON、IICSTAT两个寄存器用来控制或标识各种状态,比如选择工作工作模式,发出S信号、P信号,决定是否发出ACK信号,检测是否接收到ACK信号。


四、I2C总线接口操作     

        针对4412处理器的I2C总线接口,具备4种操作模式:  

1 -- 主机发送模式

2 -- 主机接收模式

3 -- 从机发送模式

4 -- 从机接收模式


下面将描述这些操作模式之间的功能关系:

0、数据有效性

 

       SDA线上的数据必须在时钟的高电平周期保持稳定。数据线的高或低电平状态IIC位传输数据的有效性在SCL线的时钟信号是低电平才能改变

 

1.  开始和停止条件

       当4412的I2C接口空闲时,它往往工作在从机模式。或者说,4412的的i2c接口在SDA线上察觉到一个起始信号之前它应该工作在从机模式。当控制器改变4412的i2c接口的工作模式为主机模式后,SDA线上发起数据传输并且控制器会产生SCL时钟信号。
      开始条件通过SDA线进行串行的字节传输,一个停止信号终止数据传输,停止信号是指SCL在高电平器件SDA线有从低到高电平的跳变,主机端产生起始和停止条件。当主、从设备产生一个起始信号后,I2C总线将进入忙状态。这里需要说明的是上述主从设备都有可能作为主机端。
      当一个主机发送了一个起始信号后,它也应该发送一个从机地址以通知总线上的从设备。这个地址字节的低7位表示从设备地址,最高位表示传输数据的方向,即主机将要进行读还是写。当最高位是0时,它将发起一个写操作(发送操作);当最高位是1时,它将发起一个读数据的请求(接收操作)。
      主机端发起一个结束信号以完成传输操作,如果主机端想在总线上继续进行数据的传输,它将发出另外一个起始信号和从设备地址。用这样的方式,它们可以用各种各样的格式进行读写操作。

下图为起始和停止信号:


 

下面先提前讲一下具体应用中如何启动和恢复IIC的传输

启动或恢复4412的I2C传输有以下两种方法。

1) 当IICCON[4]即中断状态位为0时,通过写IICSTAT寄存器启动I2C操作。有以下两种情况。

1--在主机模式,令IICSTAT[5:4]等于0b11,将发出S信号和IICDS寄存器的数据(寻址),令IICSTAT[5:4]等于0b01,将发出P信号。
2--在从机模式,令IICSTAT[4]等于1将等待其他主机发出S信号及地址信息。

 

2)当IICCON[4]即中断状态为1时,表示I2C操作被暂停。在这期间设置好其他寄存器之后,向IICCON[4]写入0即可恢复I2C操作。所谓“设置其他寄存器”,有以下三种情况:

1--对于主机模式,可以按照上面1的方法写IICSTAT寄存器,恢复I2C操作后即可发出S信号和IICDS寄存器的值(寻址),或发出P信号。
2--对于发送器,可以将下一个要发送的数据写入IICDS寄存器中,恢复I2C操作后即可发出这个数据。
3--对于接收器,可以从IICDS寄存器读出接收到的数据。最后向IICCON[4]写入0的同时,设置IICCON[7]以决定是否在接收到下一个数据后是否发出ACK信号。


2.  数据传输格式
       放到SDA线上的所有字节数据的长度应该为8位,在每次传输数据时,对传输数据量没有限制。在起始信号后的第一个数据字节应该包含地址字段,当4412的I2C接口被设置为主模式时,地址字节应该有控制器端发出。在每个字节后,应该有一个应答位。

     如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能继续接收或发送下一个字节,从机可以拉低SCL迫使主机进入等待状态。当从机准备好接收下一个数据并释放SCL后,数据传输继续。如果主机在传输数据期间也需要完成一些其他功能(例如一个内部中断服务程序)也可以拉低SCL以占住总线。

下面的图中将说明数据传输格式:



上图中说明,在传输完每个字节数据后,都会有一个应带信号,这个应答信号在第9个时钟周期。具体过程如下(注意下面描述的读写过程都是针对Tiny4412处理器而言,当有具体的I2C设备与4412相连时,数据表示什么需要看具体的I2C设备,4412是不知道数据的含义的):


写过程:主机发送一个起始信号S→发送从机7位地址和1位方向,方向位表示写→主机释放SDA线方便从机给回应→有从机匹配到地址,拉低SDA线作为ACK→主机重新获得SDA传输8位数据→主机释放SDA线方便从机给回应→从机收到数据拉低SDA线作为ACK告诉主机数据接收成功→主机发出停止信号。


读过程:主机发送一个起始信号S→发送从机7位地址和1位方向,方向位表示读→主机释放SDA线方便从机给回应→有从机匹配到地址,拉低SDA线作为ACK→从机继续占用SDA线,用SDA传输8位数据给主机→从机释放SDA线(拉高)方便主机给回应→主机接收到数据→主机获得SDA线控制并拉低SDA线作为ACK告诉从机数据接收成功→主机发出停止信号。

注意:在具体的I2C通信时,要看I2C设备才能确定读写时序,比如下面即将描述的第七大点中的示例,读写EEPROM中就会说道具体的数据含义,读写过程。


3. 应答信号的传输
        为了完成一个字节数据的传输,接收方将发送一个应答位给发送方。应答信号出现在SCL线上的时钟周期中的第九个时钟周期,为了发送或接收1个字节的数据,主机端会产生8个时钟周期,为了传输一个ACK位,主机端需要产生一个时钟脉冲。
        ACK时钟脉冲到来之际,发送方会在SDA线上设置高电平以释放SDA线。在ACK时钟脉冲之间,接收方会驱动和保持SDA线为低电平,这发生在第9个时钟脉冲为高电平期间。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号(即不发出ACK信号),以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。



4. 读写操作
       当I2C控制器在发送模式下发送数据后,I2C总线接口将等待直到移位寄存器(I2CDS)接收到一个数据。在往此寄存器写入一个新数据前,SCL线应该保持为低电平,写完数据后,I2C控制器将释放SCL线。当前正在传输的数据传输完成后,4412会捕捉到一个中断,然后cpu将开始往I2CDS寄存器中写入一个新的数据。
       当I2C控制器在接收模式下接收到数据后,I2C总线接口将等待直到I2CDS寄存器被读。在读到新数据之前,SCL线会被保持为低电平,读到数据后I2C控制器将释放掉SCL线。一个新数据接收完成后,4412将收到一个中断,cpu收到这个中断请求后,它将从I2CDS寄存器中读取数据。


5. 总线仲裁机制
    总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况,这种情况叫做总线竞争。I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的:当多个主器件同时想占用总线时,如果某个主器件发送高电平,而另一个主器件发送低电平,则发送电平与此时SDA总线电平不符的那个器件将自动关闭其输出级。总线竞争的仲裁是在两个层次上进行的。首先是地址位的比较,如果主器件寻址同一个从器件,则进入数据位的比较,从而确保了竞争仲裁的可靠性。由于是利用I2C总线上的信息进行仲裁,因此不会造成信息的丢失。

6. 终止条件
       当一个从接收者不能识别从地址时,它将保持SDA线为高电平。在这样的情况下,主机会产生一个停止信号并且取消数据的传输。当终止传输产生后,主机端接收器会通过取消ACK的产生以告诉从机端发送器结束发送操作。这将在主机端接收器接收到从机端发送器发送的最后一个字节之后发生,为了让主机端产生一个停止条件,从机端发送者将释放SDA线

7. 配置I2C总线
      如果要设置I2C总线中SCL时钟信号的频率,可以在I2CCON寄存器中设置4位分频器的值。I2C总线接口地址值存放在I2C总线地址寄存器(I2CADD)中,默认值未知。


8. 每种模式下的操作流程图
      在I2C总线上执行任何的收发Tx/Rx操作前,应该做如下配置:
(1)在I2CADD寄存器中写入从设备地址
(2)设置I2CCON控制寄存器
         a. 使能中断
         b. 定义SCL频率
(3)设置I2CSTAT寄存器以使能串行输出


下图为主设备发送模式



下图为主设备接收模式



下图为从设备发送模式



下图为从设备接收

模式




1-- I2C总线控制寄存器

      IICCON寄存器用于控制是否发出ACK信号、设置发送器的时钟、开启I2C中断,并标识中断是否发生


使用IICCON寄存器时,有如下注意事项
1)、发送模式的时钟频率由位[6]、位[3:0]联合决定。另外,当IICCON[6]=0时,IICCON[3:0]不能取0或1。

2)、位[4]用来标识是否有I2C中断发生,读出为0时标识没有中断发生,读出为1时标识有中断发生。当此位为1时,SCL线被拉低,此时所以I2C传输停止;如果要继续传输,需写入0清除它。
中断在以下3中情况下发生:
1 -- 当发送地址信息或接收到一个从机地址并且吻合时;
2 -- 当总线仲裁失败时;
3 -- 当发送/接收完一个字节的数据(包括响应位)时;

3)、基于SDA、SCL线上时间特性的考虑,要发送数据时,先将数据写入IICDS寄存器,然后再清除中断

4)、如果IICCON[5]=0,IICCON[4]将不能正常工作,所以,即使不使用I2C中断,也要将IICCON[5]设为1.

 

2 -- I2C状态寄存器

     IICSTAT寄存器用于选择I2C接口的工作模式,发出S信号、P信号,使能接收/发送功能,并标识各种状态,比如总线仲裁是否成功、作为从机时是否被寻址、是否接收到0地址、是否接收到ACK信号等。



 3 -- I2C数据发送/接收移位寄存器


 

 

下面是个IIC总线实例:

 用IIC总线实现CPU与MPU-6050的数据查询

具体代码如下:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #include "exynos_4412.h"    
  2.     
  3. //****************************************    
  4. //  MPU6050内部地址    
  5. //****************************************    
  6. #define SMPLRT_DIV      0x19    //陀螺仪采样率,典型值:0x07(125Hz)    
  7. #define CONFIG          0x1A    //低通滤波频率,典型值:0x06(5Hz)    
  8. #define GYRO_CONFIG     0x1B    //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)    
  9. #define ACCEL_CONFIG    0x1C    //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)    
  10. #define ACCEL_XOUT_H    0x3B    
  11. #define ACCEL_XOUT_L    0x3C    
  12. #define ACCEL_YOUT_H    0x3D    
  13. #define ACCEL_YOUT_L    0x3E    
  14. #define ACCEL_ZOUT_H    0x3F    
  15. #define ACCEL_ZOUT_L    0x40    
  16. #define TEMP_OUT_H      0x41    
  17. #define TEMP_OUT_L      0x42    
  18. #define GYRO_XOUT_H     0x43    
  19. #define GYRO_XOUT_L     0x44    
  20. #define GYRO_YOUT_H     0x45    
  21. #define GYRO_YOUT_L     0x46    
  22. #define GYRO_ZOUT_H     0x47    
  23. #define GYRO_ZOUT_L     0x48    
  24. #define PWR_MGMT_1      0x6B    //电源管理,典型值:0x00(正常启用)    
  25. #define WHO_AM_I        0x75    //IIC地址寄存器(默认数值0x68,只读)    
  26. #define SlaveAddress    0xD0    //IIC写入时的地址字节数据,+1为读取    
  27.     
  28.     
  29.     
  30. void mydelay_ms(int time)    
  31. {    
  32.     int i, j;    
  33.     while(time--)    
  34.     {    
  35.         for (i = 0; i < 5; i++)    
  36.             for (j = 0; j < 514; j++);    
  37.     }    
  38. }    
  39. /**********************************************************************    
  40.  * @brief       iic read a byte program body    
  41.  * @param[in]   slave_addr, addr, &data    
  42.  * @return      None    
  43.  **********************************************************************/    
  44. void iic_read(unsigned char slave_addr, unsigned char addr, unsigned char *data)    
  45. {    
  46.     I2C5.I2CDS = slave_addr; //将从机地址写入I2CDS寄存器中    
  47.     I2C5.I2CCON = (1 << 7)|(1 << 6)|(1 << 5); //设置时钟并使能中断    
  48.     I2C5.I2CSTAT = 0xf0; //[7:6]设置为0b11,主机发送模式;    
  49.                          //往[5:4]位写0b11,即产生启动信号,发出IICDS寄存器中的地址    
  50.     while(!(I2C5.I2CCON & (1 << 4))); // 等待传输结束,传输结束后,I2CCON [4]位为1,标识有中断发生;    
  51.                                       // 此位为1时,SCL线被拉低,此时I2C传输停止;    
  52.     I2C5.I2CDS = addr; //写命令值    
  53.     I2C5.I2CCON = I2C5.I2CCON & (~(1 << 4)); // I2CCON [4]位清0,继续传输    
  54.     while(!(I2C5.I2CCON & (1 << 4))); // 等待传输结束    
  55.     I2C5.I2CSTAT = 0xD0; // I2CSTAT[5:4]位写0b01,发出停止信号    
  56.     
  57.     I2C5.I2CDS = slave_addr | 1; //表示要读出数据    
  58.     I2C5.I2CCON = (1 << 7)|(1 << 6) |(1 << 5) ; //设置时钟并使能中断    
  59.     I2C5.I2CSTAT = 0xb0; //[7:6]位0b10,主机接收模式;    
  60.                          //往[5:4]位写0b11,即产生启动信号,发出IICDS寄存器中的地址    
  61.     //I2C5.I2CCON = I2C5.I2CCON & (~(1 << 4));    
  62.     while(!(I2C5.I2CCON & (1 << 4))); //等待传输结束,接收数据    
  63.     
  64.     I2C5.I2CCON &= ~((1<<7)|(1 << 4)); // I2CCON [4]位清0,继续传输,接收数据,    
  65.                                        // 主机接收器接收到最后一字节数据后,不发出应答信号 no ack    
  66.                                        // 从机发送器释放SDA线,以允许主机发出P信号,停止传输;    
  67.     while(!(I2C5.I2CCON & (1 << 4)));  // 等待传输结束   
  68.     *data = I2C5.I2CDS;  
  69.     I2C5.I2CSTAT = 0x90;  
  70.     I2C5.I2CCON &= ~(1<<4);       /*clean interrupt pending bit  */  
  71.   
  72. }  
  73. /********************************************************************** 
  74.  * @brief       iic write a byte program body 
  75.  * @param[in]   slave_addr, addr, data 
  76.  * @return      None 
  77.  **********************************************************************/  
  78. void iic_write (unsigned char slave_addr, unsigned char addr, unsigned char data)  
  79. {  
  80.     I2C5.I2CDS = slave_addr;  
  81.     I2C5.I2CCON = (1 << 7)|(1 << 6)|(1 << 5) ;  
  82.     I2C5.I2CSTAT = 0xf0;  
  83.     while(!(I2C5.I2CCON & (1 << 4)));  
  84.   
  85.     I2C5.I2CDS = addr;  
  86.     I2C5.I2CCON = I2C5.I2CCON & (~(1 << 4));  
  87.     while(!(I2C5.I2CCON & (1 << 4)));  
  88.   
  89.     I2C5.I2CDS = data;  
  90.     I2C5.I2CCON = I2C5.I2CCON & (~(1 << 4));  
  91.     while(!(I2C5.I2CCON & (1 << 4)));  
  92.   
  93.     I2C5.I2CSTAT = 0xd0;  
  94.     I2C5.I2CCON = I2C5.I2CCON & (~(1 << 4));  
  95.     mydelay_ms(10);  
  96.   
  97. }  
  98.   
  99. void MPU6050_Init ()  
  100. {  
  101.     iic_write(SlaveAddress, PWR_MGMT_1, 0x00);  
  102.     iic_write(SlaveAddress, SMPLRT_DIV, 0x07);  
  103.     iic_write(SlaveAddress, CONFIG, 0x06);  
  104.     iic_write(SlaveAddress, GYRO_CONFIG, 0x18);  
  105.     iic_write(SlaveAddress, ACCEL_CONFIG, 0x01);  
  106. }  
  107. int get_data(unsigned char addr)  
  108. {  
  109.     char data_h, data_l;  
  110.     iic_read(SlaveAddress, addr, &data_h);  
  111.     iic_read(SlaveAddress, addr+1, &data_l);  
  112.     return (data_h<<8)|data_l;  
  113. }  
  114.   
  115. /* 
  116.  *  裸机代码,不同于LINUX 应用层, 一定加循环控制 
  117.  */  
  118. int main(void)  
  119. {  
  120.     int data;  
  121.   
  122.     unsigned char zvalue;  
  123.     GPB.CON = (GPB.CON & ~(0xff<<8)) | 0x33<<8; // GPBCON[3], I2C_5_SCL GPBCON[2], I2C_5_SDA  
  124.     mydelay_ms(100);  
  125.     uart_init();  
  126.   
  127. /*---------------------------------------------------------------------*/  
  128.     I2C5.I2CSTAT = 0xD0;  
  129.     I2C5.I2CCON &= ~(1<<4);       /*clean interrupt pending bit  */  
  130. /*---------------------------------------------------------------------*/  
  131.   
  132.     mydelay_ms(100);  
  133.     MPU6050_Init();  
  134.     mydelay_ms(100);  
  135.   
  136.     printf("\n********** I2C test!! ***********\n");  
  137.   
  138.     while(1)  
  139.     {  
  140.         //Turn on  
  141.   
  142.         data = get_data(GYRO_ZOUT_H);  
  143.         printf(" GYRO --> Z <---:Hex: %x", data);  
  144.         data = get_data(GYRO_XOUT_H);  
  145.         printf(" GYRO --> X <---:Hex: %x", data);  
  146.         printf("\n");  
  147.         mydelay_ms(1000);  
  148.     }  
  149.     return 0;  
  150. }  

实验结果如下:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. ********** I2C test!! ***********  
  2.  GYRO --> Z <---:Hex: 1c GYRO --> X <---:Hex: feda  
  3.  GYRO --> Z <---:Hex: fefc GYRO --> X <---:Hex: fed6  
  4.  GYRO --> Z <---:Hex: fefe GYRO --> X <---:Hex: fed6  
  5.  GYRO --> Z <---:Hex: fefe GYRO --> X <---:Hex: fedc  
  6.  GYRO --> Z <---:Hex: fefe GYRO --> X <---:Hex: feda  
  7.  GYRO --> Z <---:Hex: fefc GYRO --> X <---:Hex: fed6  
  8.  GYRO --> Z <---:Hex: fefe GYRO --> X <---:Hex: feda  
  9.  GYRO --> Z <---:Hex: fcf2 GYRO --> X <---:Hex: 202  
  10.  GYRO --> Z <---:Hex: ec GYRO --> X <---:Hex: faa0  
  11.  GYRO --> Z <---:Hex: 4c GYRO --> X <---:Hex: e  
  12.  GYRO --> Z <---:Hex: fe GYRO --> X <---:Hex: fed8  
  13.  GYRO --> Z <---:Hex: 0 GYRO --> X <---:Hex: fede  
  14.  GYRO --> Z <---:Hex: 0 GYRO --> X <---:Hex: feda 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Exynos4412裸机开发 —— A/D转换器

一、Exynos4412 A/D转换器概述 1、简述 10位或12位CMOS再循环式模拟数字转换器&#xff0c;它具有10通道输入&#xff0c;并可将模拟量转换至10位或12位二进制数。5Mhz A/D 转换时钟时&#xff0c;最大1Msps的转换速度。A/D转换具备片上采样保持功能&#xff0c;同时也支持待机…

Exynos4412裸机开发 —— UART

一、Exynos4412 UART 的特性 Exynos4412 中UART&#xff0c;有4 个独立的通道&#xff0c;每个通道都可以工作于中断模式或DMA 模式&#xff0c;即 UART 可以发出中断或 DMA 请求以便在UART 、CPU 间传输数据。UART 由波特率发生器、发送器、接收器和控制逻辑组成。 使用系统时…

Exynos4412裸机开发 —— 看门狗定时器

一、看门狗定时器概述 看门狗&#xff08;WatchDog Timer) 定时器和PWM的定时功能目的不一样。它的特点是&#xff0c;需要不同的接收信号&#xff08;一些外置看门狗芯片&#xff09;或重新设置计数器&#xff0c;保持计数值不为0。一旦一些时间接收不到信号&#xff0c;或计数…

Exynos4412裸机开发 —— RTC 实时时钟单元

RTC(Real-Time Clock) 实时时钟。RTC是集成电路&#xff0c;通常称为时钟芯片。在一个嵌入式系统中&#xff0c;通常采用RTC来提供可靠的系统时间&#xff0c;包括时分秒和年月日等&#xff0c;而且要求在系统处于关机状态下它也能正常工作&#xff08;通常采用后备电池供电&am…

Exynos4412裸机开发——中断处理

以KEY2控制LED3亮灭为例&#xff1a; 一、轮询方式 【0】检测按键k2&#xff0c;按键k2按下一次&#xff0c;灯LED2闪一次。 【1】查看原理图&#xff0c;连接引脚和控制逻辑 &#xff08;1&#xff09;按键k2 连接在GPX1_1引脚 &#xff08;2&#xff09;控制逻辑 k2 按…

远程WEB控制MP3播放器设计(基于mini2440)

网上有很多 基于mini2440的MP3播放器设计的资料&#xff0c;多是按键控制&#xff0c;这里博主做了些轻微改动&#xff0c;利用远程WEB来控制MP3播放&#xff0c;具体怎么实现&#xff0c;下面会给出&#xff0c;大家先看看效果&#xff1a; WEB界面&#xff1a; 后台运行&…

嵌入式数据库 SQLite 浅析

SQLite是一个非常轻量级自包含(lightweight and self-contained)的DBMS&#xff0c;它可移植性好&#xff0c;很容易使用&#xff0c;很小&#xff0c;高效而且可靠。SQLite嵌入到使用它的应用程序中&#xff0c;它们共用相同的进程空间&#xff0c;而不是单独的一个进程。从外…

socket 请求Web服务器过程

HTTP协议只是一个应用层协议&#xff0c;它底层是通过TCP进行传输数据的。因此&#xff0c;浏览器访问Web服务器的过程必须先有“连接建立”的发生。 而有人或许会问&#xff1a;众所周知&#xff0c;HTTP协议有两大特性&#xff0c;一个是“无连接”性&#xff0c;一个是“无状…

有些事情现在不做一辈子就都不会做了

这句话最近一直印在我的脑海里。这句话最早是在Casperkid的百度空间里面看见的&#xff0c;那时他生日。作为师傅的刺&#xff08;道哥&#xff09;送了他自己写的一本《白帽子讲WEB安全》给他&#xff0c;并在扉页上写着这句话。那时一看到这句话&#xff0c;仿佛有种触电的感…

HTTP 数据包头解析

一、连接至Web服务器 一个客户端应用&#xff08;如Web浏览器&#xff09;打开到Web服务器的HTTP端口的一个套接字&#xff08;缺省为80&#xff09;。 例如&#xff1a;http://www.myweb.com:8080/index.html 在Java中&#xff0c;这将等同于代码&#xff1a; [java] view pla…

Shell 脚本中如何使用make命令

最近开发的项目中需要编写Shell脚本对整个工程进行自动化编译&#xff0c;即在Shell脚本中使用make命令来进行编译&#xff0c;下面回顾一下Shell脚本中如何使用make命令&#xff09; 在开发一个系统时&#xff0c;一般是将一个系统分成几个模块&#xff0c;这样做提高了系统的…

Shell 脚本知识回顾 (六) —— Shell 函数

一、Shell函数&#xff1a;Shell函数返回值、删除函数、在终端调用函数 函数可以让我们将一个复杂功能划分成若干模块&#xff0c;让程序结构更加清晰&#xff0c;代码重复利用率更高。像其他编程语言一样&#xff0c;Shell 也支持函数。Shell 函数必须先定义后使用。 Shell 函…

Shell 脚本知识回顾 (五) —— Shell 循环

一、Shell for循环 与其他编程语言类似&#xff0c;Shell支持for循环。 for循环一般格式为&#xff1a;for 变量 in 列表 docommand1command2...commandN done 列表是一组值&#xff08;数字、字符串等&#xff09;组成的序列&#xff0c;每个值通过空格分隔。每循环一次&…

Shell 脚本知识回顾 (四) —— Shell 命令及Shell 相关语句

一、Shell echo命令 echo是Shell的一个内部指令&#xff0c;用于在屏幕上打印出指定的字符串。命令格式&#xff1a;echo arg您可以使用echo实现更复杂的输出格式控制。 显示转义字符 echo "\"It is a test\""结果将是&#xff1a;"It is a test"…

Shell 脚本知识回顾 (三) —— 替换、运算符、字符串、数组

一、Shell替换&#xff1a;Shell变量替换&#xff0c;命令替换&#xff0c;转义字符 如果表达式中包含特殊字符&#xff0c;Shell 将会进行替换。例如&#xff0c;在双引号中使用变量就是一种替换&#xff0c;转义字符也是一种替换。 举个例子&#xff1a; [cpp] view plaincop…

Shell 脚本知识回顾 (二) —— Shell变量

一、Shell变量&#xff1a;Shell变量的定义、删除变量、只读变量、变量类型 Shell支持自定义变量。定义变量 定义变量时&#xff0c;变量名不加美元符号&#xff08;$&#xff09;&#xff0c;如&#xff1a; [cpp] view plaincopy variableName"value" 注意&…

Shell 脚本知识回顾 (一) —— 基础篇

一、Shell简介&#xff1a;什么是Shell&#xff0c;Shell命令的两种执行方式 Shell本身是一个用C语言编写的程序&#xff0c;它是用户使用Unix/Linux的桥梁&#xff0c;用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言&#xff0c;又是一种程序设计语言。作为命令…

红帽集群RHCS

1、简介&#xff1a;RHCS是RedHatClusterSuite的缩写&#xff0c;也就是红帽子集群套件&#xff0c;RHCS是一个能够提供高可用性、高可靠性、负载均衡、存储共享且经济廉价的集群工具集合&#xff0c;它将集群系统中三大集群架构融合一体&#xff0c;可以给web应用、数据库应用…

Java 基础——数组解析

数组对于每一门编辑应语言来说都是重要的数据结构之一&#xff0c;当然不同语言对数组的实现及处理也不尽相同。 Java语言中提供的数组是用来存储固定大小的同类型元素。 可以声明一个数组变量&#xff0c;如numbers[100]来代替直接声明100个独立变量number0&#xff0c;number…

《在你身边,为你设计》-哪位知道下载、在线阅读地址啊?

《在你身边&#xff0c;为你设计》-前端UI必读出自腾讯CDChttp://cdc.tencent.com/?p6761今天听同事说这本书写的非常好&#xff0c;改变了他关于前端UI的许多看法&#xff0c;可谓&#xff1a;醍醐灌顶。可惜我网上找了下都需要Money买&#xff0c;哪位有在线阅读、PDF下载地…