现在先了解一下TEA6320,TEA6320是一个I2C总线控制音响应用的立体声放大器,,它的I2C协议和音量控制如下:

它的主要代码:


void delay1ms(unsigned int Delay ) //1ms延时
{
unsigned int j;
for(;Delay>0;Delay--)
for(j=0;j<125;j++);
} void init() ///总线初始化 将总线都拉高一释放总线 发送启动信号前,要先初始化总线。即总线检测到总线空闲才开始发送启动信号
{
SDA=1;
_nop_();
SCL=1;
_nop_();
} void InitUART(void)
{
TMOD = 0x20; //将Timer1设置为Mode2以产生波特率
SCON = 0x50; //串口工作方式2
TH1 = 0xfd; //波特率9600
TL1 = TH1;
PCON = 0x00; //将SMOD设置为0
TR1 = 1; //开启定时器1
EA=1; //开启总中断
ES=1; //开启串口中断
} void SendData(uchar Dat) //发送数据
{
ACC = Dat;
CY=P;
TB8=~CY;
SBUF=ACC;
while(!TI);
TI = 0; //软件复位
} void I2C_start()
{
SDA=1; //起始信号
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); }
void I2C_stop()
{
SDA=0; //停止信号
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void ack() //应答信号
{
SDA=0;
_nop_();
SCL=1;
_nop_();
SCL=0;
_nop_();
// SDA = 1;
// SCL = 1;
// _nop_();
// while(SDA==1);
// SCL = 0;
} void I2C_sendByte(unsigned char dat) //发送数据
{
unsigned char temp;
unsigned char i;
SCL=0;
_nop_();
_nop_();
_nop_();
_nop_();
for(i=0;i<8;i++) //要发送的数据长度为8位
{
temp=dat;
if(temp<<i&0x80)
SDA=1; //判断发送位
else SDA=0;
_nop_();
SCL=1; //置时钟线为高,通知从机开始接受数据位
_nop_();
_nop_();
_nop_(); //保证时钟高电平周期大于4us `
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0; //拉低SCL,为下次数据传输做好准备
_nop_();
_nop_();
}
SDA=1; //释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号
_nop_();
_nop_();
_nop_();
_nop_();
} main()
{
InitUART();
init();
while(1)
{ CS=1;
A10=0;
A11=0;
A12=0;
A13=0;
A14=0;
OE=0; /*.....ENABLE变低,总线开始接受数据.....*/
ALE=0;
bb=0;
ii=P0;
aa=0xff;
V24=0;
if(ii==0x8f) // 5个按钮不动作,关的状态
{
delay1ms(50);
if(ii==0x8f)
{
bb=0xf9;
P0=bb; aa=0x11;
delay1ms(200);
CS=1;
A10=1;
A11=0;
A12=0;
A13=0;
A14=0;
WE=0;
delay1ms(500); }
}
if(ii==0x8e)
{
delay1ms(50);
if(ii==0x8e)
{
bb=0xf1;
P0=bb; aa=0x11;
delay1ms(200);
CS=1;
A10=1;
A11=0;
A12=0;
A13=0;
A14=0;
WE=0;
delay1ms(500);
SendData(0xAA);
I2C_start();
I2C_sendByte(0x80); //MAD,第一个字节
ack();
I2C_sendByte(0x00); //SAD,第二个字节
ack();
I2C_sendByte(0x2C); //响度 +20dB
ack();
I2C_sendByte(0x3f); //前右 响度0dB
ack();
I2C_sendByte(0x3f); //前左 响度0dB
ack();
I2C_sendByte(0x3F); //后右 响度0dB
ack();
I2C_sendByte(0x3F); //后左 响度0dB
ack();
I2C_sendByte(0x10); //低音 响度+15dB
ack();
I2C_sendByte(0x10); //高音 响度+15dB
ack();
I2C_sendByte(0x7f); //声道选择 直接静音关闭,选通IAL和IAR
ack();
I2C_stop();
delay1ms(5000);
I2C_start();
I2C_sendByte(0x80); //MAD
ack();
I2C_sendByte(0x00); //SAD
ack();
I2C_sendByte(0x2C); //响度 +20dB
ack();
I2C_sendByte(0x3f); //前右 响度0dB
ack();
I2C_sendByte(0x3f); //前左 响度0dB
ack();
I2C_sendByte(0x3F); //后右 响度0dB
ack();
I2C_sendByte(0x3F); //后左 响度0dB
ack();
I2C_sendByte(0x10); //低音 响度+15dB
ack();
I2C_sendByte(0x10); //高音 响度+15dB
ack();
I2C_sendByte(0xff); //声道选择 直接静音,选通IAL和IAR
ack();
I2C_stop();
SendData(0x55); }
}
if(ii==0x8d) //4脚按钮动作处于开的状态
{
delay1ms(50);
if(ii==0x8d)
{
bb=0xe9;
P0=bb; aa=0x11;
delay1ms(200);
CS=1;
A10=1;
A11=0;
A12=0;
A13=0;
A14=0;
WE=0;
delay1ms(500);
SendData(0xAA);
I2C_start();
I2C_sendByte(0x80); //MAD
ack();
I2C_sendByte(0x00); //SAD
ack();
I2C_sendByte(0x2C); //响度 +20dB
ack();
I2C_sendByte(0x3f); //前右 响度0dB
ack();
I2C_sendByte(0x3f); //前左 响度0dB
ack();
I2C_sendByte(0x3F); //后右 响度0dB
ack();
I2C_sendByte(0x3F); //后左 响度0dB
ack();
I2C_sendByte(0x10); //低音 响度+15dB
ack();
I2C_sendByte(0x10); //高音 响度+15dB
ack();
I2C_sendByte(0x7e); //声道选择 直接静音关闭,选通IBL和IBR
ack();
I2C_stop();
delay1ms(5000);
I2C_start();
I2C_sendByte(0x80); //MAD
ack();
I2C_sendByte(0x00); //SAD
ack();
I2C_sendByte(0x2C); //响度 +20dB
ack();
I2C_sendByte(0x3f); //前右 响度0dB
ack();
I2C_sendByte(0x3f); //前左 响度0dB
ack();
I2C_sendByte(0x3F); //后右 响度0dB
ack();
I2C_sendByte(0x3F); //后左 响度0dB
ack();
I2C_sendByte(0x10); //低音 响度+15dB
ack();
I2C_sendByte(0x10); //高音 响度+15dB
ack();
I2C_sendByte(0xfe); //声道选择 直接静音
ack();
I2C_stop();
SendData(0x55);
}
}
if(ii==0x8B) //8脚按钮动作处于开的状态
{
delay1ms(50);
if(ii==0x8B)
{
bb=0xd9;
P0=bb; aa=0x11;
delay1ms(200);
CS=1;
A10=1;
A11=0;
A12=0;
A13=0;
A14=0;
WE=0;
delay1ms(500); SendData(0xAA);
I2C_start();
I2C_sendByte(0x80); //MAD
ack();
I2C_sendByte(0x00); //SAD
ack();
I2C_sendByte(0x2C); //响度 +20dB
ack();
I2C_sendByte(0x3f); //前右 响度0dB
ack();
I2C_sendByte(0x3f); //前左 响度0dB
ack();
I2C_sendByte(0x3F); //后右 响度0dB
ack();
I2C_sendByte(0x3F); //后左 响度0dB
ack();
I2C_sendByte(0x10); //低音 响度+15dB
ack();
I2C_sendByte(0x10); //高音 响度+15dB
ack();
I2C_sendByte(0x7D); //声道选择 直接静音关闭,选通ICL和ICR
ack();
I2C_stop();
delay1ms(5000);
I2C_start();
I2C_sendByte(0x80); //MAD
ack();
I2C_sendByte(0x00); //SAD
ack();
I2C_sendByte(0x2C); //响度 +20dB
ack();
I2C_sendByte(0x3f); //前右 响度0dB
ack();
I2C_sendByte(0x3f); //前左 响度0dB
ack();
I2C_sendByte(0x3F); //后右 响度0dB
ack();
I2C_sendByte(0x3F); //后左 响度0dB
ack();
I2C_sendByte(0x10); //低音 响度+15dB
ack();
I2C_sendByte(0x10); //高音 响度+15dB
ack();
I2C_sendByte(0xfD); //声道选择 直接静音,选通ICL和ICR
ack();
I2C_stop();
SendData(0x55);
}
}
if(ii==0x87) //8脚按钮动作处于开的状态
{
delay1ms(50);
if(ii==0x87)
{
bb=0xb9;
P0=bb; aa=0x11;
delay1ms(200);
CS=1;
A10=1;
A11=0;
A12=0;
A13=0;
A14=0;
WE=0;
delay1ms(500); SendData(0xAA);
I2C_start();
I2C_sendByte(0x80); //MAD
ack();
I2C_sendByte(0x00); //SAD
ack();
I2C_sendByte(0x2C); //响度 +20dB
ack();
I2C_sendByte(0x3f); //前右 响度0dB
ack();
I2C_sendByte(0x3f); //前左 响度0dB
ack();
I2C_sendByte(0x3F); //后右 响度0dB
ack();
I2C_sendByte(0x3F); //后左 响度0dB
ack();
I2C_sendByte(0x10); //低音 响度+15dB
ack();
I2C_sendByte(0x10); //高音 响度+15dB
ack();
I2C_sendByte(0x7D); //声道选择 直接静音关闭,选通ICL和ICR
ack();
I2C_stop();
delay1ms(5000);
I2C_start();
I2C_sendByte(0x80); //MAD
ack();
I2C_sendByte(0x00); //SAD
ack();
I2C_sendByte(0x2C); //响度 +20dB
ack();
I2C_sendByte(0x3f); //前右 响度0dB
ack();
I2C_sendByte(0x3f); //前左 响度0dB
ack();
I2C_sendByte(0x3F); //后右 响度0dB
ack();
I2C_sendByte(0x3F); //后左 响度0dB
ack();
I2C_sendByte(0x10); //低音 响度+15dB
ack();
I2C_sendByte(0x10); //高音 响度+15dB
ack();
I2C_sendByte(0xfD); //声道选择 直接静音,选通ICL和ICR
ack();
I2C_stop();
SendData(0x55);
}
}
if(ii==0x0f)
{
delay1ms(50);
if(ii==0x0f)
{
bb=0x79;
P0=bb; aa=0x11;
delay1ms(200);
CS=1;
A10=1;
A11=0;
A12=0;
A13=0;
A14=0;
WE=0;
delay1ms(500); }
}
SendData(bb);
delay1ms(500);
if(aa==0xff)
{
P0=0x89;
CS=1;
A10=1;
A11=0;
A12=0;
A13=0;
A14=0;
WE=0;
delay1ms(500); }
SendData(aa);
delay1ms(500); } }
其中I2C的应答代码
void ack()   //应答信号
{
SDA=0;
_nop_();
SCL=1;
_nop_();
SCL=0;
_nop_();
// SDA = 1;
// SCL = 1;
// _nop_();
// while(SDA==1);
// SCL = 0;
}

下面屏蔽的那几段代码会影响到I2C的接收,发送

怎么对TEA6320的理解呢,详看TEA6320的协议,MAD(从地址)是第一个字节,SAD(子地址)是第二个字节,第三个字节就是I2C真正要传输的数据,协议上说超过1个字节,数据将被发送,自动增加显著子地址,即TEA6320在写入数据超过1个字节的时候,子地址能自动递增,所以,子地址只需取列表第一个音量/响度的控制寄存器0x00,余下的子地址功能寄存器,系统会自动增加,而第三个字节就需要一一写上全部控制的数据。

这是本人自己查找资料结合自己的思考理解,有需要的同行看了,有发现什么不对的地方,请指出来,谢谢。

关于具有I2C总线的TEA6320的使用的更多相关文章

  1. I2C总线(异步)

    起始位与停止位的定义: 起始信号:当SCL为高期间,SDA由高到低的跳变:启动信号是一种电平跳变时序信号,而不是一个电平信号. 停止信号:当SCL为高期间,SDA由低到高的跳变:停止信号也是一种电平跳 ...

  2. i2c总线,设备,驱动之间的关系

    ------ 总线上先添加好所有具体驱动,i2c.c遍历i2c_boardinfo链表,依次建立i2c_client, 并对每一个i2c_client与所有这个线上的驱动匹配,匹配上,就调用这个驱动的 ...

  3. [I2C]I2C总线协议图解

    转自:http://blog.csdn.net/w89436838/article/details/38660631 1  I2C总线物理拓扑结构      I2C 总线在物理连接上非常简单,分别由S ...

  4. Linux设备驱动模型之I2C总线

    一.I2C子系统总体架构 1.三大组成部分 (1)I2C核心(i2c-core):I2C核心提供了I2C总线驱动(适配器)和设备驱动的注册.注销方法,提供了与具体硬件无关的I2C读写函数. (2)I2 ...

  5. I2C总线和S5PV210的I2C总线控制器

    一.什么是I2C通信协议? 1.物理接口:SCL + SDA (1)SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道. (2)SDA(serial ...

  6. I2C总线协议的简要说明

    为了快速的了解I2C总线协议,此处采用另类的方式进行说明. 倘若你和另外一个人只能通过一个开关加灯泡的装置在不同的两个房间进行交流,以下是很简单能说明的一个模型: 你的房间有一个开关,另外一间房间有一 ...

  7. Linux+I2C总线分析(主要是probe的方式)

    Linux I2C 总线浅析 ㈠ Overview Linux的I2C体系结构分为3个组成部分: ·I2C核心: I2C核心提供了I2C总线驱动和设备驱动的注册.注销方法,I2C通信方法(即“algo ...

  8. Linux I2C总线控制器驱动(S3C2440)

    s3c2440的i2c控制器驱动(精简DIY),直接上代码,注释很详细: #include <linux/kernel.h> #include <linux/module.h> ...

  9. Linux I2C总线设备驱动模型分析(ov7740)

    1. 框架1.1 硬件协议简介1.2 驱动框架1.3 bus-drv-dev模型及写程序a. 设备的4种构建方法a.1 定义一个i2c_board_info, 里面有:名字, 设备地址 然后i2c_r ...

随机推荐

  1. js漂浮广告实现代码(合集经典)

    <html> <head> <title>漂浮广告</title> <body> <div id="codefans_net ...

  2. Hyperledger Fabric 1.0 学习搭建 (一)--- 基础环境搭建

    1: 环境构建在本文中用到的宿主机环境是Centos ,版本为Centos.x86_64 7.2, 一定要用7版本以上, 要不然会安装出错. 通过Docker 容器来运行Fabric的节点,版本为v1 ...

  3. AngularJs学习笔记--I18n/L10n

    原版地址:http://code.angularjs.org/1.0.2/docs/guide/i18n 一.I18n and L10n in AngularJS 1. 什么是I18n和L10n? 国 ...

  4. hdu-2886 Special Prime---数论推导

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2866 题目大意: 问你1到L中有多少个素数满足n^3 + p*n^2 = m^3(其中n,m为大于1 ...

  5. 弃坑pexpect,入坑paramiko

    上文书说到,ssh库pexpect的使用,简直就是个“月亮公主”——满眼全是坑.勉强把程序写好了,跑起来的时候发现了一个新坑,让我不可抗拒的把它弃掉了——经常莫名其妙的连不上服务器!开线程连接14台服 ...

  6. javascript 构造函数方式定义对象 (转载)

    javascript 构造函数方式定义对象   javascript是动态语言,可以在运行时给对象添加属性,也可以给对象删除(delete)属性 <html> <head> & ...

  7. VC++ MFC工程中中如何将一个工程的资源(如对话框)复制到另外一个工程

    问题的提出:在工程1中用到的资源,在工程2中已有现成的.即工程1中要用到的对话框和工程2的完全相同,而工程2中对该对话框的布局已设计好.控件变量都绑定好了.但由于该对话框的控件特别多,如果在工程1中再 ...

  8. C#中Form的Paint事件响应方法与重载虚方法OnPaint()的区别

    Form_Paint()方法是Paint事件的响应方法,OnPaint是可重载的虚方法,OnPaint方法是调用Paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的: protec ...

  9. ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy)

    ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy) 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了, ...

  10. 使用jenkins配置.net mvc5网站自动构建全过程记录

    持续集成是个简单重复劳动,人来操作费时费力,使用自动化构建工具完成是最好不过的了.最终可以实现的一个效果是,svn提交代码,服务器端自动编译并发布. 所使用的版本:windows server 200 ...