欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 實現TEA5767與51單片機的通訊,主要為讀寫正常運行。 [打印本頁]

作者: 唱歌睡覺打豆豆    時間: 2019-3-9 15:37
標題: 實現TEA5767與51單片機的通訊,主要為讀寫正常運行。

在具體實驗時,SDACLK接單片機引腳,BUSMOD接地,其余4、789、10引腳空接。

TEA5767主要電性能指標:工作電壓:2.5-5V,工作電流10mA,靈敏度15V,輸出信號電平75mV,可通過I2CSPI總線驅動。

TEA5767寫入數據時,地址的最低位是0,即寫地址是C0。讀出數據時地址的最低位是1,即讀地址是C1。TEA5767的控制寄存器要寫入5個字節,每次寫入數據時必須嚴格按照下列順序進行:地址、字節1、字節2、字節3、字節4、字節5。每個字節的最高位首先發送。在時鐘的下降沿后寫入的數據生效。上電復位后,設置為靜音,所有其它位均被置低,必須寫入控制字初始化芯片。



I2C總線


I2C總線是一種簡單、雙向兩線制同步串行總線。其中:SDA串行數據線,SCL是串行時鐘線。接口電路為開漏輸出,需通過上拉電阻接VCC

地址幀(address frame7-bit數據(其中高四位為器件類型識別符,接著三位為片選符)+1-bit操作符(1表示讀操作,0表示寫操作)+1-bit ACK/NACK

這個幀中前面8bits發送完后,接收端的設備獲得SDA控制權,此時接收設備應該在第9個時鐘脈沖之前回復一個ACK(將SDA拉低)以表示接收正常,如果接收設備沒有將SDA拉低,則說明接收設備可能沒有收到數據(如尋址的設備不存在或設備忙)或無法解析收到的消息,如果是這樣,則由master來決定如何處理(stoprepeatedstart condition)。


數據幀(data frames):

在地址幀發送之后,就可以開始傳輸數據了。Master繼續產生時鐘脈沖,而數據則由master(寫操作)或slave(讀操作)放到SDA上。每個數據幀8bits,數據幀的數量可以是任意的,直到產生停止條件。每一幀數據傳輸(即每8-bit)之后,接收方就需要回復一個ACKNACK(寫數據時由slave發送ACK,讀數據時由master發送ACK。當master知道自己讀完最后一個byte數據時,可發送NACK然后接stopcondition)。
  1. void I2C_start()//啟動I2C 總線
  2. {
  3.         I2C_SDA=1;//發生起始條件的數據信號
  4.         _Nop();
  5.         _Nop();
  6.         I2C_SCL=1;
  7.         _Nop();_Nop();_Nop();_Nop();
  8.         I2C_SDA=0;//發生起始信號
  9.         _Nop();_Nop();_Nop();_Nop();
  10.         I2C_SCL=0;// 鉗住I2C總線,準備發送或接收數據 
  11. }
  12. /////////////////////////////////////////
  13. void I2C_stop()//停止I2C總線
  14. {
  15.         I2C_SDA=0;
  16.         I2C_SCL=0;// 發送結束條件的數據信號
  17.         _Nop();
  18.         I2C_SCL=1;
  19.         _Nop();_Nop();_Nop();_Nop();
  20.         I2C_SDA=1;// 發送I2C總線結束信號
  21. }
  22. /////////////////////////////////////////
  23. bit I2c_waitAck()//MCU等待應答
  24. {
  25.         uchar ErrTime=400;// 因故障接收方無ACK,超時值。
  26.         I2C_SCL=0;
  27.         I2C_SDA=1;
  28.         _Nop();_Nop();
  29.         I2C_SCL=1;
  30.         while(I2C_SDA)
  31.         {
  32.                 ErrTime--;
  33.                 if(ErrTime==0)
  34.                 {
  35.                         I2C_stop();
  36.                         return 0;
  37.                 }
  38.         }
  39.                 I2C_SCL=1;
  40.         _Nop();
  41.         _Nop();
  42.         _Nop();
  43.         _Nop();
  44.        
  45.         return 1;
  46. }
  47. ////////////////////////////////
  48. void I2c_Ack(void)//MCU應答信號
  49. {
  50.         I2C_SDA=0;
  51.         I2C_SCL=0;
  52.         _Nop();_Nop();_Nop();_Nop();
  53.                 I2C_SCL=1;
  54.   _Nop();_Nop();_Nop();_Nop();
  55.         I2C_SCL=0;
  56. }
  57. ///////////////////////////////
  58. void I2c_NoAck(void)//MCU不應答信號
  59. {
  60.         I2C_SDA=1;
  61.         I2C_SCL=0;
  62.         _Nop();_Nop();
  63.                 I2C_SCL=1;
  64.   _Nop();_Nop();
  65.         I2C_SCL=0;
  66. }
  67. ////////////////////////////////
  68. void I2C_Send_Byte(unsigned char sen)
  69. {
  70.         unsigned char i=8;
  71.         while(i--)
  72.         {
  73.                 I2C_SCL=0;
  74.                 _Nop();
  75.                 _Nop();
  76.         if(sen &0x80)
  77.                 I2C_SDA=1;
  78.         else
  79.                 I2C_SDA=0;
  80.         _Nop();
  81.         _Nop();
  82.         I2C_SCL=1;  
  83.         _Nop();  
  84.         sen<<=1;
  85.   }
  86.   I2c_waitAck();
  87. }



  88. static unsigned char I2C_Receive_Byte(void)
  89. {
  90.         unsigned char i=8,data_buffer;
  91.         I2C_SDA=1;
  92.         while(i--)
  93.         {
  94.                 I2C_SCL=0;
  95.      _Nop();_Nop(); _Nop();_Nop();
  96.                 I2C_SCL=1;
  97.                 _Nop();_Nop();
  98.                 data_buffer<<=1;
  99.                 if(I2C_SDA) data_buffer++;
  100.         }
  101.         return (data_buffer);
  102. }
  103. /////////////////////////////////////////
  104. void ATIICxx_PWrite(unsigned char *McuAddress,unsigned char count)//向模塊寫入數據
  105. {
  106.         I2C_start();
  107.         I2C_Send_Byte(0xc0);//寫入起始地址
  108.         while(count--)
  109.         {
  110.                 I2C_Send_Byte(*(unsigned char*)McuAddress);
  111.                 ((unsigned char*)McuAddress)++;
  112.         }
  113.         I2C_stop();
  114. }
  115. void ATIICxx_PRead(unsigned char *McuAddress,unsigned char count)
  116. //讀取模塊數據
  117. {
  118.         I2C_start();
  119.         I2C_Send_Byte(0xc1);//讀取起始地址
  120.         while(count--)
  121.         {
  122.         *McuAddress=I2C_Receive_Byte();
  123.                 I2c_Ack();
  124.                 McuAddress++;
  125.         }
  126.         I2c_NoAck();
  127.         I2C_stop();
  128. }
  129. void main()
  130. {
  131.        
  132.         radio_write_data[0]=0x2f;
  133.         radio_write_data[1]=0x19;
  134.         radio_write_data[2]=0x80;
  135.         radio_write_data[3]=0x37;
  136.         radio_write_data[4]=0x00;
  137.         ys(210);
  138.         ATIICxx_PWrite(&radio_write_data[0],0);
  139.         radio_write_data[0]=0x2f;
  140.         ys(340);
  141.   ATIICxx_PWrite(&radio_write_data[0],0);
  142. if(K2==0)
  143.                 {
  144.                         ys(30);
  145.                         if(K2==0)
  146.                         {
  147.                                 while(1){
  148.                 ATIICxx_PRead(radio_read_data,2);//讀取時 ,寫入時可改為ATIICxx_PWrite(&radio_write_data[0],2);后一位可以改變寫入數據個數

  149.                                         ys(1000);
  150.                                                         ys(1000);
  151.                                        
  152.                         }
  153.                         }
  154.                 }
  155.         }
復制代碼







歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1