现在先了解一下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. Python学习---高阶函数的学习

    高阶函数 高阶函数:函数名可以作为参数传递输入,函数名还可以作为返回值返回 函数名可以重新赋值,因为其本身就是一个变量    函数本身就是一个对象,    函数的变量名f本身就是指向函数本身的,加上括 ...

  2. SAP技术专家的ABAP调试器培训材料

    首先弄清楚ABAP Classic调试器和新调试器的区别: Classic debugger: (1) Static breakpoint a. BREAK-POINT : non-user spec ...

  3. TypeScript----函数

    function add(x:number,y:number):number{ return x+y; } let myAdd=function(x:number,y:number):number{ ...

  4. nrf52832协议栈S132特性记录

    1. NRF52832带蓝牙协议栈的程序是如何跳转的? 答:如果NRF52832烧录了协议栈S132和用户应用程序,那么程序会先从协议栈的MBR启动,然后跳转到应用程序执行. 2. 关于中断的执行是怎 ...

  5. web.xml中Listener的作用

    Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应 ...

  6. 生成并部署SSH key

    1.如何生成ssh公钥 你可以按如下命令来生成 sshkey: ssh-keygen -t rsa -C "xxxxx@xxxxx.com" # Generating public ...

  7. 说说application/x-www-form-urlencoded和application/json的区别

    今天一位同事在于微信小程序开发人员那边在对接测试的时候,遇到了一个错误,安卓那边是以application/json作为请求体类型,而Java这边仍向往常那样没有多么大的变化,但是就是前台传输的数据为 ...

  8. java和spring 线程池总结

    1. spring 的线程池 ThreadPoolTaskExecutor @Configuration public class ThreadPoolConfig { @Bean("thr ...

  9. 【转载】RETE算法研究

    本文转自:http://www.ibm.com/developerworks/cn/opensource/os-drools/ RETE算法是大多数规则引擎采用的一种模式匹配算法,比如开源的Drool ...

  10. WPF几个样式

    其实也是大家学的最多的,网上的. 1.老版360 2.360悬浮窗 不好意思,没有找到悬浮球的图片,随便一个代替了 3.老版迅雷 4.新版360 遗憾的是这个样式没有完整的源代码.只是一个演示和图片代 ...