经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
关于具有I2C总线的TEA6320的使用
来源:cnblogs  作者:玮_weir  时间:2018/9/25 20:32:46  对本文有异议

 

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

 



 

 

 

 

它的主要代码:

  1.  
  1. void delay1ms(unsigned int Delay ) //1ms延时
  2. {
  3. unsigned int j;
  4. for(;Delay>0;Delay--)
  5. for(j=0;j<125;j++);
  6. }
  7. void init() ///总线初始化 将总线都拉高一释放总线 发送启动信号前,要先初始化总线。即总线检测到总线空闲才开始发送启动信号
  8. {
  9. SDA=1;
  10. _nop_();
  11. SCL=1;
  12. _nop_();
  13. }
  14. void InitUART(void)
  15. {
  16. TMOD = 0x20; //将Timer1设置为Mode2以产生波特率
  17. SCON = 0x50; //串口工作方式2
  18. TH1 = 0xfd; //波特率9600
  19. TL1 = TH1;
  20. PCON = 0x00; //将SMOD设置为0
  21. TR1 = 1; //开启定时器1
  22. EA=1; //开启总中断
  23. ES=1; //开启串口中断
  24. }
  25. void SendData(uchar Dat) //发送数据
  26. {
  27. ACC = Dat;
  28. CY=P;
  29. TB8=~CY;
  30. SBUF=ACC;
  31. while(!TI);
  32. TI = 0; //软件复位
  33. }
  34. void I2C_start()
  35. {
  36. SDA=1; //起始信号
  37. _nop_();
  38. SCL=1;
  39. _nop_();
  40. _nop_();
  41. _nop_();
  42. _nop_();
  43. _nop_();
  44. SDA=0;
  45. _nop_();
  46. _nop_();
  47. _nop_();
  48. _nop_();
  49. _nop_();
  50. }
  51. void I2C_stop()
  52. {
  53. SDA=0; //停止信号
  54. _nop_();
  55. SCL=1;
  56. _nop_();
  57. _nop_();
  58. _nop_();
  59. _nop_();
  60. _nop_();
  61. SDA=1;
  62. _nop_();
  63. _nop_();
  64. _nop_();
  65. _nop_();
  66. _nop_();
  67. }
  68. void ack() //应答信号
  69. {
  70. SDA=0;
  71. _nop_();
  72. SCL=1;
  73. _nop_();
  74. SCL=0;
  75. _nop_();
  76. // SDA = 1;
  77. // SCL = 1;
  78. // _nop_();
  79. // while(SDA==1);
  80. // SCL = 0;
  81. }
  82. void I2C_sendByte(unsigned char dat) //发送数据
  83. {
    unsigned char temp;
  84. unsigned char i;
  85. SCL=0;
  86. _nop_();
  87. _nop_();
  88. _nop_();
  89. _nop_();
  90. for(i=0;i<8;i++) //要发送的数据长度为8位
  91. {
  92. temp=dat;
  93. if(temp<<i&0x80)
  94. SDA=1; //判断发送位
  95. else SDA=0;
  96. _nop_();
  97. SCL=1; //置时钟线为高,通知从机开始接受数据位
  98. _nop_();
  99. _nop_();
  100. _nop_(); //保证时钟高电平周期大于4us `
  101. _nop_();
  102. _nop_();
  103. _nop_();
  104. _nop_();
  105. _nop_();
  106. _nop_();
  107. SCL=0; //拉低SCL,为下次数据传输做好准备
  108. _nop_();
  109. _nop_();
  110. }
  111. SDA=1; //释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号
  112. _nop_();
  113. _nop_();
  114. _nop_();
  115. _nop_();
  116. }
  117. main()
  118. {
  119. InitUART();
  120. init();
  121. while(1)
  122. {
  123. CS=1;
  124. A10=0;
  125. A11=0;
  126. A12=0;
  127. A13=0;
  128. A14=0;
  129. OE=0; /*.....ENABLE变低,总线开始接受数据.....*/
  130. ALE=0;
  131. bb=0;
  132. ii=P0;
  133. aa=0xff;
  134. V24=0;
  135. if(ii==0x8f) // 5个按钮不动作,关的状态
  136. {
  137. delay1ms(50);
  138. if(ii==0x8f)
  139. {
  140. bb=0xf9;
  141. P0=bb;
  142. aa=0x11;
  143. delay1ms(200);
  144. CS=1;
  145. A10=1;
  146. A11=0;
  147. A12=0;
  148. A13=0;
  149. A14=0;
  150. WE=0;
  151. delay1ms(500);
  152. }
  153. }
  154. if(ii==0x8e)
  155. {
  156. delay1ms(50);
  157. if(ii==0x8e)
  158. {
  159. bb=0xf1;
  160. P0=bb;
  161. aa=0x11;
  162. delay1ms(200);
  163. CS=1;
  164. A10=1;
  165. A11=0;
  166. A12=0;
  167. A13=0;
  168. A14=0;
  169. WE=0;
  170. delay1ms(500);
  171. SendData(0xAA);
  172. I2C_start();
  173. I2C_sendByte(0x80); //MAD,第一个字节
  174. ack();
  175. I2C_sendByte(0x00); //SAD,第二个字节
  176. ack();
  177. I2C_sendByte(0x2C); //响度 +20dB
  178. ack();
  179. I2C_sendByte(0x3f); //前右 响度0dB
  180. ack();
  181. I2C_sendByte(0x3f); //前左 响度0dB
  182. ack();
  183. I2C_sendByte(0x3F); //后右 响度0dB
  184. ack();
  185. I2C_sendByte(0x3F); //后左 响度0dB
  186. ack();
  187. I2C_sendByte(0x10); //低音 响度+15dB
  188. ack();
  189. I2C_sendByte(0x10); //高音 响度+15dB
  190. ack();
  191. I2C_sendByte(0x7f); //声道选择 直接静音关闭,选通IAL和IAR
  192. ack();
  193. I2C_stop();
  194. delay1ms(5000);
  195. I2C_start();
  196. I2C_sendByte(0x80); //MAD
  197. ack();
  198. I2C_sendByte(0x00); //SAD
  199. ack();
  200. I2C_sendByte(0x2C); //响度 +20dB
  201. ack();
  202. I2C_sendByte(0x3f); //前右 响度0dB
  203. ack();
  204. I2C_sendByte(0x3f); //前左 响度0dB
  205. ack();
  206. I2C_sendByte(0x3F); //后右 响度0dB
  207. ack();
  208. I2C_sendByte(0x3F); //后左 响度0dB
  209. ack();
  210. I2C_sendByte(0x10); //低音 响度+15dB
  211. ack();
  212. I2C_sendByte(0x10); //高音 响度+15dB
  213. ack();
  214. I2C_sendByte(0xff); //声道选择 直接静音,选通IAL和IAR
  215. ack();
  216. I2C_stop();
  217. SendData(0x55);
  218. }
  219. }
  220. if(ii==0x8d) //4脚按钮动作处于开的状态
  221. {
  222. delay1ms(50);
  223. if(ii==0x8d)
  224. {
  225. bb=0xe9;
  226. P0=bb;
  227. aa=0x11;
  228. delay1ms(200);
  229. CS=1;
  230. A10=1;
  231. A11=0;
  232. A12=0;
  233. A13=0;
  234. A14=0;
  235. WE=0;
  236. delay1ms(500);
  237. SendData(0xAA);
  238. I2C_start();
  239. I2C_sendByte(0x80); //MAD
  240. ack();
  241. I2C_sendByte(0x00); //SAD
  242. ack();
  243. I2C_sendByte(0x2C); //响度 +20dB
  244. ack();
  245. I2C_sendByte(0x3f); //前右 响度0dB
  246. ack();
  247. I2C_sendByte(0x3f); //前左 响度0dB
  248. ack();
  249. I2C_sendByte(0x3F); //后右 响度0dB
  250. ack();
  251. I2C_sendByte(0x3F); //后左 响度0dB
  252. ack();
  253. I2C_sendByte(0x10); //低音 响度+15dB
  254. ack();
  255. I2C_sendByte(0x10); //高音 响度+15dB
  256. ack();
  257. I2C_sendByte(0x7e); //声道选择 直接静音关闭,选通IBL和IBR
  258. ack();
  259. I2C_stop();
  260. delay1ms(5000);
  261. I2C_start();
  262. I2C_sendByte(0x80); //MAD
  263. ack();
  264. I2C_sendByte(0x00); //SAD
  265. ack();
  266. I2C_sendByte(0x2C); //响度 +20dB
  267. ack();
  268. I2C_sendByte(0x3f); //前右 响度0dB
  269. ack();
  270. I2C_sendByte(0x3f); //前左 响度0dB
  271. ack();
  272. I2C_sendByte(0x3F); //后右 响度0dB
  273. ack();
  274. I2C_sendByte(0x3F); //后左 响度0dB
  275. ack();
  276. I2C_sendByte(0x10); //低音 响度+15dB
  277. ack();
  278. I2C_sendByte(0x10); //高音 响度+15dB
  279. ack();
  280. I2C_sendByte(0xfe); //声道选择 直接静音
  281. ack();
  282. I2C_stop();
  283. SendData(0x55);
  284. }
  285. }
  286. if(ii==0x8B) //8脚按钮动作处于开的状态
  287. {
  288. delay1ms(50);
  289. if(ii==0x8B)
  290. {
  291. bb=0xd9;
  292. P0=bb;
  293. aa=0x11;
  294. delay1ms(200);
  295. CS=1;
  296. A10=1;
  297. A11=0;
  298. A12=0;
  299. A13=0;
  300. A14=0;
  301. WE=0;
  302. delay1ms(500);
  303. SendData(0xAA);
  304. I2C_start();
  305. I2C_sendByte(0x80); //MAD
  306. ack();
  307. I2C_sendByte(0x00); //SAD
  308. ack();
  309. I2C_sendByte(0x2C); //响度 +20dB
  310. ack();
  311. I2C_sendByte(0x3f); //前右 响度0dB
  312. ack();
  313. I2C_sendByte(0x3f); //前左 响度0dB
  314. ack();
  315. I2C_sendByte(0x3F); //后右 响度0dB
  316. ack();
  317. I2C_sendByte(0x3F); //后左 响度0dB
  318. ack();
  319. I2C_sendByte(0x10); //低音 响度+15dB
  320. ack();
  321. I2C_sendByte(0x10); //高音 响度+15dB
  322. ack();
  323. I2C_sendByte(0x7D); //声道选择 直接静音关闭,选通ICL和ICR
  324. ack();
  325. I2C_stop();
  326. delay1ms(5000);
  327. I2C_start();
  328. I2C_sendByte(0x80); //MAD
  329. ack();
  330. I2C_sendByte(0x00); //SAD
  331. ack();
  332. I2C_sendByte(0x2C); //响度 +20dB
  333. ack();
  334. I2C_sendByte(0x3f); //前右 响度0dB
  335. ack();
  336. I2C_sendByte(0x3f); //前左 响度0dB
  337. ack();
  338. I2C_sendByte(0x3F); //后右 响度0dB
  339. ack();
  340. I2C_sendByte(0x3F); //后左 响度0dB
  341. ack();
  342. I2C_sendByte(0x10); //低音 响度+15dB
  343. ack();
  344. I2C_sendByte(0x10); //高音 响度+15dB
  345. ack();
  346. I2C_sendByte(0xfD); //声道选择 直接静音,选通ICL和ICR
  347. ack();
  348. I2C_stop();
  349. SendData(0x55);
  350. }
  351. }
  352. if(ii==0x87) //8脚按钮动作处于开的状态
  353. {
  354. delay1ms(50);
  355. if(ii==0x87)
  356. {
  357. bb=0xb9;
  358. P0=bb;
  359. aa=0x11;
  360. delay1ms(200);
  361. CS=1;
  362. A10=1;
  363. A11=0;
  364. A12=0;
  365. A13=0;
  366. A14=0;
  367. WE=0;
  368. delay1ms(500);
  369. SendData(0xAA);
  370. I2C_start();
  371. I2C_sendByte(0x80); //MAD
  372. ack();
  373. I2C_sendByte(0x00); //SAD
  374. ack();
  375. I2C_sendByte(0x2C); //响度 +20dB
  376. ack();
  377. I2C_sendByte(0x3f); //前右 响度0dB
  378. ack();
  379. I2C_sendByte(0x3f); //前左 响度0dB
  380. ack();
  381. I2C_sendByte(0x3F); //后右 响度0dB
  382. ack();
  383. I2C_sendByte(0x3F); //后左 响度0dB
  384. ack();
  385. I2C_sendByte(0x10); //低音 响度+15dB
  386. ack();
  387. I2C_sendByte(0x10); //高音 响度+15dB
  388. ack();
  389. I2C_sendByte(0x7D); //声道选择 直接静音关闭,选通ICL和ICR
  390. ack();
  391. I2C_stop();
  392. delay1ms(5000);
  393. I2C_start();
  394. I2C_sendByte(0x80); //MAD
  395. ack();
  396. I2C_sendByte(0x00); //SAD
  397. ack();
  398. I2C_sendByte(0x2C); //响度 +20dB
  399. ack();
  400. I2C_sendByte(0x3f); //前右 响度0dB
  401. ack();
  402. I2C_sendByte(0x3f); //前左 响度0dB
  403. ack();
  404. I2C_sendByte(0x3F); //后右 响度0dB
  405. ack();
  406. I2C_sendByte(0x3F); //后左 响度0dB
  407. ack();
  408. I2C_sendByte(0x10); //低音 响度+15dB
  409. ack();
  410. I2C_sendByte(0x10); //高音 响度+15dB
  411. ack();
  412. I2C_sendByte(0xfD); //声道选择 直接静音,选通ICL和ICR
  413. ack();
  414. I2C_stop();
  415. SendData(0x55);
  416. }
  417. }
  418. if(ii==0x0f)
  419. {
  420. delay1ms(50);
  421. if(ii==0x0f)
  422. {
  423. bb=0x79;
  424. P0=bb;
  425. aa=0x11;
  426. delay1ms(200);
  427. CS=1;
  428. A10=1;
  429. A11=0;
  430. A12=0;
  431. A13=0;
  432. A14=0;
  433. WE=0;
  434. delay1ms(500);
  435. }
  436. }
  437. SendData(bb);
  438. delay1ms(500);
  439. if(aa==0xff)
  440. {
  441. P0=0x89;
  442. CS=1;
  443. A10=1;
  444. A11=0;
  445. A12=0;
  446. A13=0;
  447. A14=0;
  448. WE=0;
  449. delay1ms(500);
  450. }
  451. SendData(aa);
  452. delay1ms(500);
  453. }
  454. }

  1. 其中I2C的应答代码
  1. void ack() //应答信号
  2. {
  3. SDA=0;
  4. _nop_();
  5. SCL=1;
  6. _nop_();
  7. SCL=0;
  8. _nop_();
  9. // SDA = 1;
  10. // SCL = 1;
  11. // _nop_();
  12. // while(SDA==1);
  13. // SCL = 0;
  14. }

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

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

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

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号