作者:用户0h2eqqbg44 | 来源:互联网 | 2023-10-10 20:03
现在先了解一下TEA6320,TEA6320是一个I2C总线控制音响应用的立体声放大器,,它的I2C协议和音量控制如下:它的主要代码:下面屏蔽的那几段代码会影响到I2C的接收,发送
现在先了解一下tea6320,tea6320是一个i2c总线控制音响应用的立体声放大器,,它的i2c协议和音量控制如下:
它的主要代码:
%
ign ore_pre_1%
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<
其中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,余下的子地址功能寄存器,系统 会自动增加,而第三个字节就需要一一写上全部控制的数据。
这是本人自己查找资料结合自己的思考理解,有需要的同行看了,有发现什么不对的地方,请指出来,谢谢。