娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月20日(星期二)

2018年05月20日 | GPIO模擬I2C程序實現

發布者:baiyuguoji 來源: eefocus關鍵字:GPIO  模擬I2C 手機看文章 掃描二維碼
隨時隨地手機看文章

GPIO模擬I2C程序實現.

I2C是由Philips公司發明的一種串行數據通信協議,僅使用兩根信號線:SerialClock(簡稱SCL)和SerialData(簡稱SDA)。I2C是總線結構,1個Master,1個或多個Slave,各Slave設備以7位地址區分,地址后面再跟1位讀寫位,表示讀(=1)或者寫(=0),所以我們有時也可看到8位形式的設備地址,此時每個設備有讀、寫兩個地址,高7位地址其實是相同的。
I2C數據格式如下:
無數據:SCL=1,SDA=1;
開始位(Start):當SCL=1時,SDA由1向0跳變;
停止位(Stop):當SCL=1時,SDA由0向1跳變;
數據位:當SCL由0向1跳變時,由發送方控制SDA,此時SDA為有效數據,不可隨意改變SDA;
當SCL保持為0時,SDA上的數據可隨意改變;
地址位:定義同數據位,但只由Master發給Slave;
應答位(ACK):當發送方傳送完8位時,發送方釋放SDA,由接收方控制SDA,且SDA=0;
否應答位(NACK):當發送方傳送完8位時,發送方釋放SDA,由接收方控制SDA,且SDA=1。
當數據為單字節傳送時,格式為:
開始位,8位地址位(含1位讀寫位),應答,8位數據,應答,停止位。
當數據為一串字節傳送時,格式為:
開始位,8位地址位(含1位讀寫位),應答,8位數據,應答,8位數據,應答,……,8位數據,應答,停止位。
需要注意的是:
1,SCL一直由Master控制,SDA依照數據傳送的方向,讀數據時由Slave控制SDA,寫數據時由Master控制SDA。當8位數據傳送完畢之后,應答位或者否應答位的SDA控制權與數據位傳送時相反。
2,開始位“Start”和停止位“Stop”,只能由Master來發出。
3,地址的8位傳送完畢后,成功配置地址的Slave設備必須發送“ACK”。否則否則一定時間之后Master視為超時,將放棄數據傳送,發送“Stop”。
4,當寫數據的時候,Master每發送完8個數據位,Slave設備如果還有空間接受下一個字節應該回答“ACK”,Slave設備如果沒有空間接受更多的字節應該回答“NACK”,Master當收到“NACK”或者一定時間之后沒收到任何數據將視為超時,此時Master放棄數據傳送,發送“Stop”。
5,當讀數據的時候,Slave設備每發送完8個數據位,如果Master希望繼續讀下一個字節,Master應該回答“ACK”以提示Slave準備下一個數據,如果Master不希望讀取更多字節,Master應該回答“NACK”以提示Slave設備準備接收Stop信號。
6,當Master速度過快Slave端來不及處理時,Slave設備可以拉低SCL不放(SCL=0將發生“線與”)以阻止Master發送更多的數據。此時Master將視情況減慢或結束數據傳送。

7,I2C規程運用主/從雙向通訊。器件發送數據到總線上,則定義為發送器,器件接收據

定義為接收器。主器件和從器件都可以工作于接收和發送狀態。 總線必須由主器件(通常

微控制器)控制,主器件產生串行時鐘(SCL)控制總線的傳輸方向,并產生起始和停止

條件。SDA線上的數據狀態僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA

狀態的改變被用來表示起始和停止條件。

 


在實際應用中,并沒有強制規定數據接收方必須對于發送的8位數據做出回應,尤其是在Master和Slave端都是用GPIO軟件模擬的方法來實現的情況下,編程者可以事先約定數據傳送的長度,不發送ACK,有時可以起到減少系統開銷的效果。

源碼:

/********************************************************************/

void i2c_init(void)
{
PACNT_init;
PADDR_init;
PADAT_init;

SCL_high;
SDA_high;
}

/********************************************************************/

uint8 i2c_write(uint8 slave_address, uint8 *buffer, int byte_count, int freq)
{
    uint8 out_mask = 0x80;
    uint8 value = 0x00;
  uint8 send_byte = 0x00;
  uint8 status = 0x81;
  int count = 8;
  int clk_count = 0;
int i = 0;

/* Set delay value based on frequency. */
int D = (int) ((4000/freq) - 14);

slave_address = (slave_address & 0xFE);
         
  i2c_start();
  delay(500);
  
   send_byte = slave_address;
        
   for(i = 0; i <= byte_count; i++)
   {    
    count = 8;  
    out_mask = 0x80;
         
    /* Send data bytes one bit at a time. */   
    while(count > 0)
    {            
     value = ((send_byte & out_mask) ? 1 : 0);
      if (value == 1)
      {
       PADAT_init;
        SDA_high;}
      else
      {
       PADAT_init;
       SDA_low;}
       
      delay(D);     
                   
        PADAT_init;
      SCL_high;
      
      /* Clock stretching wait statement.  Wait until clock is released
      by slave.  Only effects program on first iteration.  */
   while (((GPIO_PADAT & 0x0200) ? 1 : 0) == 0){;}

      delay(2*D);  
       
      PADAT_init;
      SCL_low;
      delay(D); 
       
      out_mask >>= 1; 
      count--;   
     }
     
     PADAT_init;
     SDA_high;  /* Let go of data pin. */
     delay(D); 
      
     if (((GPIO_PADAT & 0x0400) ? 1 : 0) == 1)
     { 
      status = 0xA1; /* Transfer complete, bus busy, acknowledge not received. */
      break; } /* If not acknowledged, exit loop. */
     
    PADAT_init;
     SCL_high;
     delay(2*D);  
    
     PADAT_init;
     SCL_low;
     status = 0xA0;  /* Transfer complete, bus busy, acknowledge received. */
     delay(D); 
     
     send_byte = buffer[i];      
    }
    
    PADAT_init;
    SDA_high;
    SCL_low;   
delay(100);
return(status);
}

/********************************************************************/

uint8 i2c_read(uint8 slave_address, uint8 *buffer, int byte_count, int freq)
{
uint8 input_byte = 0x00;
uint8 value = 0x00;
uint8 out_mask = 0x80;
uint8 status = 0x81;
int count = 8;
int clk_count = 0;
int i = 0;

/* Set delay value based on frequency. */
int D = (int) ((4000/freq) - 14);

slave_address = (slave_address | 0x01);
   
i2c_start();
delay(500);
               
/**********  Write Address Procedure **********/
  
   while(count > 0)
   {
    value = ((slave_address & out_mask) ? 1 : 0);
     if (value == 1)
     {
      PADAT_init;
       SDA_high;}
     else
     {
      PADAT_init;
      SDA_low;}
      delay(D);      
                   
      PADAT_init;
     SCL_high;
      
     /* Clock stretching wait.  Wait until clock is released
     by slave.  */
     while (((GPIO_PADAT & 0x0200) ? 1 : 0) == 0){;}

     delay(2*D); 
       
     PADAT_init;
     SCL_low;
     delay(D);  
       
     out_mask >>= 1; 
     count--;         
  }
     
    PADAT_init;
  SDA_high;  /* Let go of data pin. */
    delay(D);
    SCL_high;
    delay(2*D);  
    
    /* If not acknowleged, set status accordingly and exit read process. */
    if (((GPIO_PADAT & 0x0400) ? 1 : 0) == 1)
    {
     status = 0xA1;
     return(status);}
    
    PADAT_init;
    SCL_low;
    delay(D);

/**********  Begin Read Procedure **********/

/* Release SDA and SCL to initiate transfer. */
PADAT_init;    
SDA_high;
SCL_high;

for(i = 0; i < byte_count; i++)
{
  count = 8;
  input_byte = 0x00;
   
  PADAT_init;
  SCL_high;
   
  /* Clock stretching wait.  Wait until clock is released
     by slave.  */
  while (((GPIO_PADAT & 0x0200) ? 1 : 0) == 0){;}
           
  /* Loop for bit-by-bit read of data. */
  while(count > 0) 
  {
    PADAT_init;
    SCL_high;
    delay(D);  
    delay(4); /* Required to make read and write clocks the same freq. */
    
   if ((GPIO_PADAT & 0x0600) == 0x0600)
    input_byte++;
  
   delay(D);  
   
   PADAT_init;
   SCL_low;
   delay(2*D); 
      
   if (count == 1)
    break;
   else  
    input_byte <<= 1;
  
   count--;
  }

  /* Write input byte to "read_buffer". */
  buffer[i] = input_byte;
    
  if(i == (byte_count - 1))
   break;
     
     /* Below is the acknowledge procedure. */     
     PADAT_init;
     SDA_low;
     delay(D);  
     SCL_high;     
  delay(2*D);  
    
     PADAT_init;
     SCL_low;
     delay(D);  
     SDA_high; 
     status = 0xA0; 
}     

/* Standard protocol calls for the last read byte to
    not receive an acknowledge from the master. */     
PADAT_init;
    SDA_high;
    SCL_high;     
delay(2*D); 
     
   PADAT_init;
   SCL_low;
   delay(D);  
   SDA_high;
   status = 0xA1;
   return(status);
}

/********************************************************************/

void i2c_start(void)
{
int clk_count = 0;
uint8 compare = 0x00;

PADAT_init;  
SDA_high;
delay(100);

PADAT_init;  
SCL_high;
delay(100);

/* Clock stretching wait.  Wait until clock is released
    by slave.  */
while (((GPIO_PADAT & 0x0200) ? 1 : 0) == 0){;}    
  
PADAT_init;
SDA_low;
delay(100);
     
    PADAT_init;  
SCL_low;
delay(100);
}

/********************************************************************/

uint8 i2c_stop(void)
{
uint8 status = 0x00;
int clk_count = 0;
  
PADAT_init;
SCL_low;
delay(100);

PADAT_init;
SDA_low;
delay(100);
    
    PADAT_init; 
SCL_high;

/* Clock stretching wait statement.  Wait until clock is released
    by slave.  */
while (((GPIO_PADAT & 0x0200) ? 1 : 0) == 0){;}
      
delay(100);
    
    PADAT_init; 
SDA_high;
status = 0x81; /* Set bus idle. */
return(status);
}

/********************************************************************/

void delay(int value)
{
int clk_count = 0;
while (clk_count < value)
{clk_count++;}
}

/********************************************************************/

 

第二個例子

函數定義:

gpio_iic.h:

#ifndef __IIC_GPIO__
#define __IIC_GPIO__
void delay();
/*
設置scl引腳電平,0低電平,1高電平,其他值無效,返回值一直為0,留著它用。
*/
int set_scl( int value );

/*
得到scl引腳電平,0低電平,1高電平,必須是這兩個值,其他函數需要調用。
*/
int get_scl();

/*
設置sda引腳電平,0低電平,1高電平,其他值無效,返回值一直為0,留著它用。
*/
int set_sda( int value );

/*
得到sda引腳電平,0低電平,1高電平,必須是這兩個值,其他函數需要調用。
*/
int get_sda();


/*
重新發送iic start位,這個是在傳送數據過程中使用。
*/
void iic_restart();

/*
發送iic start位,這里假設總線空閑,此時SDL與SCL都為高電平。
*/
void iic_start();

/*
發送stop位,這里假設scl此時為低電平。
*/
void iic_stop();

/*
發送一個bit0,這里假設scl此時為低電平,sda電平不定。
*/
void send_bit0();

/*
發送一個bit 1,這里假設scl此時為低電平,sda電平不定。
 */
void send_bit1();

/*
接收一個bit位,返回值只能是0或1。
 */
int receive_bit();

/*
發送ACK,實際上是發送一個bit0.
*/
void send_ack();

/*
接收ACK。
*/
int receive_ack();

/*
接收一個字節。
*/
char receive_byte();

/*
接收一個buf,返回值總是為0,它不能保證從器件一定能收到ACK,也不能保證從器件正在工作。
*/
int receive_buf( char *buf, int buf_size );

/*
發送一個字節,返回ACK的值,發送時,沒有收到ACK會重試n次,這是常。
 */
int send_byte( char data_byte );

/*
發送一個buf,返回值是成功發送,收到ACK的字節數量。
*/
int send_buf( char *buf, int buf_size );

#endif


gpio_iic.c:

#include "gpio_iic.h"
//#define __80C52__
#define __MINI2440__
#ifdef __MINI2440__
#include
#include
#include
#endif

#ifdef __80C52__
#include
sbit SCL  = P1^0;
sbit SDA    = P1^1;
#endif


void delay()
{
#ifdef __MINI2440__
     udelay(1);
#endif
#ifdef __80C52__
     int i = 0;
     for( i = 0; i < 10000; i ++ );
#endif
}
/*
設置scl引腳電平,0低電平,1高電平,其他值無效,返回值一直為0,留著它用。
*/
int set_scl( int value )
{

#ifdef __MINI2440__
//    s3c2410_gpio_cfgpin(S3C2410_GPE(15), S3C2410_GPE15_IICSDA);
//     s3c2410_gpio_cfgpin(S3C2410_GPE(14), S3C2410_GPE14_IICSCL);
     s3c2410_gpio_cfgpin(S3C2410_GPE(14), S3C2410_GPIO_OUTPUT);
     switch( value )
     {
     case 0:
      s3c2410_gpio_setpin(S3C2410_GPE(14), 0); // IICSCL
      break;
     case 1:
      s3c2410_gpio_setpin(S3C2410_GPE(14), 1); // IICSCL
      break;
     default:
      break;
     }
#endif

#ifdef __80C52__
     if ( 0 == value )
      SCL = 0;
     else if ( 1 == value )
      SCL = 1;
#endif
     return 0;                  
}


/*
得到scl引腳電平,0低電平,1高電平,必須是這兩個值,其他函數需要調用。
*/
int get_scl()
{
#ifdef __MINI2440__
     s3c2410_gpio_cfgpin(S3C2410_GPE(14), S3C2410_GPIO_INPUT);
     return s3c2410_gpio_getpin(S3C2410_GPE(14)) > 0 ? 1: 0;
#endif

#ifdef __80C52__
     return SCL;
#endif
}

 

/*
設置sda引腳電平,0低電平,1高電平,其他值無效,返回值一直為0,留著它用。
*/
int set_sda( int value )
{
#ifdef __MINI2440__
     s3c2410_gpio_cfgpin(S3C2410_GPE(15), S3C2410_GPIO_OUTPUT);
     switch( value )
     {
     case 0:
      s3c2410_gpio_setpin(S3C2410_GPE(15), 0); // IICSDA
      break;
     case 1:
      s3c2410_gpio_setpin(S3C2410_GPE(15), 1); // IICSDA
      break;
     default:
      break;
     }
#endif
#ifdef __80C52__
     if ( 0 == value )
      SDA = 0;
     else if ( 1 == value )
      SDA = 1;    
#endif        
     return 0;
}

 

/*
得到sda引腳電平,0低電平,1高電平,必須是這兩個值,其他函數需要調用。
*/
int get_sda()
{
#ifdef __MINI2440__
     int sda_pin = 0;
     s3c2410_gpio_cfgpin(S3C2410_GPE(15), S3C2410_GPIO_INPUT);
     sda_pin = s3c2410_gpio_getpin(S3C2410_GPE(15)) > 0 ? 1:0;
     return sda_pin;
#endif
#ifdef __80C52__
     return SDA;
#endif
}


/*
重新發送iic start位,這個是在傳送數據過程中使用。
*/
void iic_restart()
{
     set_scl( 0 );
     delay();
     set_sda( 1 );
     delay();
     set_scl( 1 );
     delay();
     set_sda( 0 );
     delay();
     set_scl( 0 );
     delay();
}


/*
發送iic start位,這里假設總線空閑,此時SDL與SCL都為高電平。
*/
void iic_start()
{
     set_sda( 0 );
     delay();
     set_scl( 0 );
     delay();
}

/*
發送stop位,這里假設scl此時為低電平。
*/
void iic_stop()
{
     set_sda( 0 );
     delay();
     set_scl( 1 );
     delay();
     set_sda( 1 );        
     delay();
}


/*
發送一個bit0,這里假設scl此時為低電平,sda電平不定。
*/
void send_bit0()
{
     set_sda( 0 );
     delay();
     set_scl( 1 );
     delay();
     set_scl( 0 );
     delay();
}

/*
發送一個bit 1,這里假設scl此時為低電平,sda電平不定。
 */
void send_bit1()
{
     set_sda( 1 );
     delay();
     set_scl( 1 );
     delay();
     set_scl( 0 );
     delay();
}

/*
接收一個bit位,返回值只能是0或1。
 */
int receive_bit()
{
     int value = -1;

     set_sda( 1 );
     delay();
     set_scl( 0 );
     delay();
     set_scl( 1 );
     delay();
     value = get_sda();
     set_scl( 0 );
     return value;    
}

/*
發送ACK,實際上是發送一個bit0.
*/
void send_ack( )
{
     send_bit0();
}

/*
接收ACK。
*/
int receive_ack()
{
     int ack = 1;
     set_sda( 1 );
     delay();
     set_scl( 1 );
     delay();
     ack = get_sda();        
     delay();
     set_scl( 0 );
     return ack;
}

/*
接收一個字節。
*/
char receive_byte( )
{
     int i = 0;
     int recv_data = 0;
     for ( i = 0; i < 8; i++ )
     {
      recv_data = recv_data | receive_bit();
      if ( 7 == i )
           break;
      recv_data <<= 1;
     }
     send_ack();
     return recv_data;    
}

/*
接收一個buf,返回值總是為0,它不能保證從器件一定能收到ACK,也不能保證從器件正在工作。
*/
int receive_buf( char *buf, int buf_size )
{
     int i = 0;
     for( i = 0; i < buf_size; i ++ )
     {
      buf[i] = receive_byte();
     }
     return buf_size;
}

/*
發送一個字節,返回ACK的值,發送時,沒有收到ACK會重試n次,這是常。
 */
int send_byte( char data_byte )
{
     int retry_count = 8;//重試次數。
     int i = 0;
     int ack = 1;        
     char send_data = 0;
     send_data = data_byte;
     do{
      for ( i = 0; i < 8; i ++ )
      {
           if ( 0x80 & send_data )
            send_bit1();
           else
            send_bit0();
           send_data <<= 1;
      }
      ack = receive_ack();
      if ( 0 == ack )
           break;
      send_data = data_byte;
      retry_count --;
     }
     while( retry_count >= 0 );
     return ack;
}

/*
發送一個buf,返回值是成功發送,收到ACK的字節數量。
*/
int send_buf( char *buf, int buf_size )
{
     int i = 0;
     int count = 0;
     for ( i = 0; i < buf_size; i ++ )
     {
      if (0 != send_byte( buf[i] ) )
           break;
      count ++;
     }
     return count;        
}

 

下面是可以用來讀寫at24c02的測試代碼,在mini2440板測試通過,

static void m24c02_send( int addr, char *buf,  int buf_size)
{
     int count = 0;
     int rev = -1;
    iic_start();
    rev = send_byte( 0xa0 );
    rev = send_byte( (addr >> 0) & 0xff );
    count = send_buf( buf, buf_size );
    iic_stop();
 
}

static void m24c02_recv( int addr , char *buf, int buf_size )
{
      iic_start();
    send_byte( 0xa0 );
    send_byte( (addr >> 0) & 0xff );
      iic_restart();
    send_byte( 0xa1 );
    receive_buf( buf, buf_size );
    iic_stop();

 

 

(1)基礎宏定義

#define GPIO_SCL             S3C2410_GPF3

#define GPIO_SDA             S3C2410_GPF0

#define GPIO_SDA_OUTP   S3C2410_GPF0_OUTP  //設定SDA輸出

#define GPIO_SDA_INP      S3C2410_GPF0_INP     //設定SDA輸入

#define GPIO_SCL_OUTP   S3C2410_GPF3_OUTP  //設定SCL輸出

void I2C_SCL_OUTP( void )

{

      s3c2410_gpio_cfgpin(GPIO_SCL,GPIO_SCL_OUTP);

}

void I2C_SCL_Output(u8 value)

{

      if(value)

      {                                               

            s3c2410_gpio_setpin(GPIO_SCL,value); 

      }

      else

      {

            s3c2410_gpio_setpin(GPIO_SCL,value ); 

      }

}

void I2C_SDA_Mode(u8 v_mode)   //SDA輸出方向

{

       if(v_mode)

       {                                               

              s3c2410_gpio_cfgpin(GPIO_SDA, GPIO_SDA_OUTP);  

       }

       else

       {

              s3c2410_gpio_cfgpin(GPIO_SDA, GPIO_SDA_INP);  

       }

}

void I2C_SDA_Output(u8 value)

{

       if(value)

       {                                               

               s3c2410_gpio_setpin(GPIO_SDA,value); 

       }

       else

       {

                s3c2410_gpio_setpin(GPIO_SDA,value ); 

       }

}

u8 I2C_SDA_Read(void)    //SDA讀數據

{

       return s3c2410_gpio_getpin(GPIO_SDA); 

}

(2)基礎段

void I2C_Init(void)

{

      I2C_SDA_Output(1);

      I2C_SCL_Output(1);      //默認拉高

}

void I2C_Wait(void)

{

      u16 i;

      for(i=0;i<200;i++);

}

void I2C_Start(void)

{

      I2C_SDA_Output(1);

      I2C_SCL_Output(1);

      I2C_Wait();

      I2C_SDA_Output(0);

      I2C_Wait();

      I2C_SCL_Output(0);

}

void I2C_Stop(void)

{

      I2C_SDA_Output(0);

      I2C_Wait();

      I2C_SCL_Output(1);

      I2C_Wait();

      I2C_SDA_Output(1);

}


 

(3)讀寫單個字節的段

u8 I2C_Send_Byte(u8 bytedata)

{

      u8 i,ack;

      I2C_SDA_Mode(1);  //SDA輸出

      I2C_SCL_OUTP();

      for (i = 0; i < 8; i++) 

      {

              if (bytedata & 0x80)

              {

                     I2C_SDA_Output(1);

              }

              else

              {

                    I2C_SDA_Output(0);

              }

              bytedata <<= 1;

            

              I2C_SCL_Output(1);

              udelay(3);

              I2C_SCL_Output(0);

              udelay(1);

       }    

  

        I2C_SDA_Output(1);  //release

        udelay(3);

       

        I2C_SDA_Mode(0);  //設定SDA輸入

        I2C_SCL_Output(1);  

        udelay(3);

        ack = I2C_SDA_Read();   //讀應答

        I2C_SDA_Mode(1);

        I2C_SCL_Output(0);

        udelay(3);

      

        return ack;  

}

u8 I2C_Receive_Byte(void) 

{

       u8 i;

       u8 bytedata = 0x00;

       u8 temp;

       I2C_SDA_Mode(0);

       for ( i = 0; i < 8; i++)

       {

             I2C_SCL_Output(1);

             udelay(3);

             bytedata <<= 1;

             temp = I2C_SDA_Read();

             printk("reda SDA'value is:%d\n",temp);

             if (temp)

                   bytedata |= 0x01;

             printk("  bytedata is:%x\n",bytedata);

             I2C_SCL_Output(0);

             udelay(1);

       }

       I2C_SDA_Mode(1);

       return bytedata;

}

(4)讀寫單個字節的I2C應用函數

u8 I2C_Byte_Write(u8 device_ID,u8 address,u8 bytedata)

{  

       u8 ack;

       printk("device_ID is:%x\n",device_ID);

       printk("address is:%x\n",address);

       printk("date is:%x\n",bytedata);

       I2C_Start(); 

       ack=I2C_Send_Byte(device_ID);

       printk("ack is:%d\n",ack);

       if(ack)

             I2C_Stop();

       I2C_Send_Byte(address);

       I2C_Send_Byte(bytedata);

       I2C_Stop();

       I2C_Wait();

       return 0;

}

u8 I2C_Byte_Read(u8 device_ID,u8 address)

{  

       u8 bytedata;

       I2C_Start();

       I2C_Send_Byte(device_ID);

       I2C_Send_Byte(address);

       I2C_Start();

       I2C_Send_Byte(device_ID+1);

       bytedata = I2C_Receive_Byte();  //讀單個字節,不需要再發應答

       I2C_Stop();   

       return bytedata;

}


關鍵字:GPIO  模擬I2C 引用地址:GPIO模擬I2C程序實現

上一篇:I2C的主機從機模擬
下一篇:普通IO口模擬實現I2C通信及應用解析

推薦閱讀

賈躍亭創造的FF91又爆出最新進展,美國互聯網電動智能汽車公司Faraday Future(簡稱FF)在5月8日FF成立4周年之際對員工發布內部信。信件中,FF稱其在中國的總部將建在廣州,而南沙工廠也將如期動工,并表示將會有更多的新生力量跟隨FF的腳步加入造車大軍。一直傳言要在中國建廠的FF這一次要來真的了?FF稱已從拓荒者轉變引領者根據FF在內部信中表示,FF成立...
注意:此文是寫給單片機初學者的。為什么要寫篇文章?雖然這個問題對于電子老白來說不值一提,不過對于初學單片機的朋友,問這個問題的人實在是太多了,以前總是一句一句的解釋給你們聽,重復的勞動實在沒有意義,看來非常有必要在這里統一的說一下了。既然是初學者,還得簡單介紹一下繼電器是個什么東西。(這是我手頭上的一個繼電器)繼電器就是個開關,...
自動駕駛哪家強?這個問題顯然是沒有最直觀的答案,因為到現在為止還沒有哪一家企業大規模推出高級別自動駕駛量產車。但是,如果從影響力來看,百度和谷歌絕對算是自動駕駛圈內名聲響當當的明星企業。百度和谷歌旗下的Waymo能做到全球真正有能力做自動駕駛平臺的巨頭,有兩個極其重要的原因。其一,它們有最核心的AI技術,給無人車提供大腦,用于環境感知...
集微網5月19日消息,今天OPPO 官宣將于5月27日發布新機Reno6系列,目前該機已經入網,我們來看看具體的配置信息。據爆料消息,OPPO Reno6 首發搭載天璣 900 芯片,內置 4300mAh 電池,支持 65W 快充,機身厚度為7.59mm,重182g。Reno 6 Pro采用6.55英寸OLED 曲面挖空屏,分辨率為2400*1080,支持 90Hz 刷新率,機身厚度為7.6mm,重177g,搭...

史海拾趣

問答坊 | AI 解惑

請教此電路圖,我是新學,請多關照

請幫忙分下下兩個圖,LOC1 其中EA,EB,EC為三相電源A,B,C,相間電壓為380V.請問J3-6,J3-8,J3-10輸出是什么,怎么變化的. LOC2中請問右邊和左邊的關系是什么,中間的元件有什么作用,十分感謝!!!…

查看全部問答∨

Ardence RTX 開發交流群:2689390,歡迎朋友們加入,共同交流,共同學習!

Ardence  RTX 開發交流群:2689390,歡迎朋友們加入,共同交流,共同學習! 頂者有分! …

查看全部問答∨

platform builder 無法建立新的項目

platform builder 無法建立新的項目  我用的是VS2005 可是提示無法找到winceroot 并指定路徑   可是我是完全按照安裝步驟來的 求救啊  各位大俠幫幫忙啊~~~~~…

查看全部問答∨

急問題 wince下 cedb數據庫使用問題

現在需要要cedb數據庫 可是寫操作CeWriteRecordProps總是不成功,返回值為0,用GetLastError得到的說是參數問題 我看過以前的帖子,因為我用的是模擬器,他說如果是模擬器 打開與pc的共享就會出現這個問題 這個是什么意思 是在哪里設置的呢? 非 ...…

查看全部問答∨

為什么我的程序老死機?

各位前輩:     最近做了個用W78E58B的溫度控制器,調試使用流水燈的方式控制三個電機測試了板子上的隔離電路,完全正常。     但是一放入真正的程序后,電機起停十來次后(三個電機起停次數不定)就自己死了。由于用流水燈 ...…

查看全部問答∨

Using fully differential op amps as attenuators Part 1

本帖最后由 dontium 于 2015-1-23 13:38 編輯 Using fully differential op amps as attenuators Part 1 Differential bipolar input signals …

查看全部問答∨

一個網友發的問題,大家看看能解答不

我在使用arm的s3c2440單片機與trf7960通信,想讀取一張符合14443a協議的卡的卡號,但我用的是普通io口模擬的spi通信,我現在實現了讀寫寄存器的功能,所以說這個不是重點,重點是我初始化好涉及到的引腳(像EN, MOSI, MISO, MOD, OOK,CS, CLK等)后 ...…

查看全部問答∨

誰有中文的74c245的參數介紹

誰有中文的74c245的參數介紹…

查看全部問答∨

FPGA的原理圖輸入方式和vhdl區別

什么時候用到原理圖,vhdl是不是能替代原理圖,原理圖輸入方式只能提供基本的邏輯運算?…

查看全部問答∨

為什么用g2553不能產生PWM波啊,求大神指教啊!

void main(void){  WDTCTL = WDTPW + WDTHOLD; //停止看門狗  init_clk(); //初始化時鐘    P2DIR |= BIT0; //方向為輸出  P2SEL |= BIT0; //選擇外部模塊功能    TACCTL1 |= OUTMOD_7;  TACCR0 = 1000-1; ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 开封县| 汤原县| 乌拉特前旗| 吉水县| 上思县| 甘泉县| 托克逊县| 安康市| 万安县| 田东县| 延边| 娄烦县| 南陵县| 绩溪县| 济南市| 招远市| 焦作市| 曲阜市| 安远县| 霞浦县| 漳平市| 靖江市| 木兰县| 包头市| 龙胜| 喀什市| 永仁县| 泸水县| 廉江市| 应城市| 灵璧县| 溆浦县| 宁海县| 大城县| 金塔县| 五指山市| 五莲县| 突泉县| 曲水县| 修武县| 离岛区|