关于具有I2C总线的TEA6320的使用
现在先了解一下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的使用的更多相关文章
- I2C总线(异步)
起始位与停止位的定义: 起始信号:当SCL为高期间,SDA由高到低的跳变:启动信号是一种电平跳变时序信号,而不是一个电平信号. 停止信号:当SCL为高期间,SDA由低到高的跳变:停止信号也是一种电平跳 ...
- i2c总线,设备,驱动之间的关系
------ 总线上先添加好所有具体驱动,i2c.c遍历i2c_boardinfo链表,依次建立i2c_client, 并对每一个i2c_client与所有这个线上的驱动匹配,匹配上,就调用这个驱动的 ...
- [I2C]I2C总线协议图解
转自:http://blog.csdn.net/w89436838/article/details/38660631 1 I2C总线物理拓扑结构 I2C 总线在物理连接上非常简单,分别由S ...
- Linux设备驱动模型之I2C总线
一.I2C子系统总体架构 1.三大组成部分 (1)I2C核心(i2c-core):I2C核心提供了I2C总线驱动(适配器)和设备驱动的注册.注销方法,提供了与具体硬件无关的I2C读写函数. (2)I2 ...
- I2C总线和S5PV210的I2C总线控制器
一.什么是I2C通信协议? 1.物理接口:SCL + SDA (1)SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道. (2)SDA(serial ...
- I2C总线协议的简要说明
为了快速的了解I2C总线协议,此处采用另类的方式进行说明. 倘若你和另外一个人只能通过一个开关加灯泡的装置在不同的两个房间进行交流,以下是很简单能说明的一个模型: 你的房间有一个开关,另外一间房间有一 ...
- Linux+I2C总线分析(主要是probe的方式)
Linux I2C 总线浅析 ㈠ Overview Linux的I2C体系结构分为3个组成部分: ·I2C核心: I2C核心提供了I2C总线驱动和设备驱动的注册.注销方法,I2C通信方法(即“algo ...
- Linux I2C总线控制器驱动(S3C2440)
s3c2440的i2c控制器驱动(精简DIY),直接上代码,注释很详细: #include <linux/kernel.h> #include <linux/module.h> ...
- Linux I2C总线设备驱动模型分析(ov7740)
1. 框架1.1 硬件协议简介1.2 驱动框架1.3 bus-drv-dev模型及写程序a. 设备的4种构建方法a.1 定义一个i2c_board_info, 里面有:名字, 设备地址 然后i2c_r ...
随机推荐
- https填坑之旅
Boss说,我们买了个权威证书,不如做全站式的https吧,让用户打开主页就能看到受信任的绿标.于是我们就开始了填坑之旅. [只上主域好不好?] 不好...console会报出一大堆warning因为 ...
- .Net深入体验与实践第一章
什么是委托?委托和事件是什么关系? 我的理解是委托朋友,事件是一个事情比如,中午12点要吃饭了,咱家搞忘了!还在继续嗨皮,我的朋友会叫我与他一起吃饭. 什么事反射? 可以获取.Net中的每个类型(类, ...
- mysql登录:access denied for user 'root'@'localhost'(using password:YES)
mysql登录: access denied for user 'root'@'localhost'(using password:YES) 解决: use mysql; select user,ho ...
- python 生成器&迭代器
列表生成式 要生成[1x1, 2x2, 3x3, ..., 10x10]>>> [x * x for x in range(1, 11)]for循环后面还可以加上if判断>&g ...
- 使用 Sinamics S120 驱动脚本配置扩展报文
为了传输故障代码.电流.温度等信息.通常需要使用扩展报文的方式来发送这些信息.在驱动数量较少的情况下,可以进行手动配置. 如果驱动数量很多,可以使用脚本script的方式来配置扩展报文. 驱动编号 注 ...
- ZT 七大寡头
网易评论人才辈出啊!!!看下面 http://comment.news.163.com/news_guoji2_bbs/9GRIIJA90001121M.html 关注 关注他的微博yftyfm ...
- 【[HAOI2009]逆序对数列】
发现自己学了几天splay已经傻了 其实还是一个比较裸的dp的,但是还是想了一小会,还sb的wa了几次 首先这道题的状态应该很好看出,我们用\(f[i][j]\)表示在前\(i\)个数中(即\(1-i ...
- springmvc需要掌握的面试知识
1:讲下Spr ingMvc和Struts1,Struts2的比较的优势 性能上Struts1>SpringMvc>Struts2 开发速度上SpringMvc和Struts2差不多,比 ...
- 强大的Windows 10数字权利获取工具HWIDGEN
前言: 每当windows 10 系统过期就是头疼的key激活,更奇怪的是每次激活的方式不同,上次有效下次就不知道有没有效了,今天发现一种更改数字权利的工具脚本,不要太牛逼!!! 安装之前的准备工作: ...
- Redis(RedisTemplate)使用hash哈希
RedisTemplate配置:https://www.cnblogs.com/weibanggang/p/10188682.html package com.wbg.springRedis.test ...