关于具有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 ...
随机推荐
- 基于NFS实现多WEB服务器负载均衡
实现环境: 实现原理: 共四台服务器 A,B,C,D 服务器A (CentOS 6.7): IP地址: 192.168.3.67 角色: DNS服务 说明: 为两台web服务器做域名轮询 服务器B,C ...
- SAP专家培训之Netweaver ABAP内存管理和内存调优最佳实践
培训者:SAP成都研究院开发人员Jerry Wang 1. Understanding Memory Objects in ABAP Note1: DATA itab WITH HEADER LINE ...
- AngularJs学习笔记--Dependency Injection(DI,依赖注入)
原版地址:http://code.angularjs.org/1.0.2/docs/guide/di 一.Dependency Injection(依赖注入) 依赖注入(DI)是一个软件设计模式,处理 ...
- 模式:模版、样式;属于分类、识别的范围;分类、归类的标准-How are patterns obtained?
模式及套路 模式:模版.样式:属于分类.识别的范围. How are patterns obtained? Through : re-use, classification and finally a ...
- tmux 后台运行程序
之前写过tmux分屏,其实这个只是方便写代码啥的,那都还不是最重要的.跑模型时,一般一跑就是一整天都是常事. 电脑关机,睡眠,ssh连接失效都会断了程序运行. solution:tmux后台运行程序! ...
- js 页面 json对象转数组
json_array(data); function json_array(data){ var len=eval(data).length; var arr=[]; for(var i=0;i< ...
- shiro简单入门介绍
shiro是apache的一个java安全框架 可以完成认证,授权,加密,会话管理,基于web继承,缓存等 功能简介: 从外部来看: shiro架构 Subject:主体,代表了当前“用户”,这个用 ...
- ASP.NET Web API编程——接口安全与角色控制
1 API接口验证与授权 JWT JWT定义,它包含三部分:header,payload,signature:每一部分都是使用Base64编码的JSON字符串.之间以句号分隔.signature是”h ...
- 再看redux
redux提供了一个全局的唯一状态树,不代表就不需要组建本身的state. 何时用react组件的state.props?? state只表示一些‘临时的’‘内部的’状态数据.临时的:代表你可以临时改 ...
- Spring boot 的profile功能如何实现多环境配置自动切换
通常服务端应用开发需要经过以下几个流程: 开发 -> 测试 -> RC验证 -> 上线 这就涉及到四个不同的环境,开发环境.测试环境.RC环境以及生产环境,为了避免不同环境之间相互干 ...