找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3019|回复: 0
打印 上一主题 下一主题
收起左侧

实现TEA5767与51单片机的通讯,主要为读写正常运行。

[复制链接]
跳转到指定楼层
楼主
ID:487423 发表于 2019-3-9 15:37 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

在具体实验时,SDACLK接单片机引脚,BUSMOD接地,其余478910引脚空接。

TEA5767主要电性能指标:工作电压:2.5-5V,工作电流10mA,灵敏度15V,输出信号电平75mV,可通过I2CSPI总线驱动。

TEA5767写入数据时,地址的最低位是0,即写地址是C0。读出数据时地址的最低位是1,即读地址是C1TEA5767的控制寄存器要写入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.         }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表