你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103学习笔记(2)——收音机模块TEA5767使用

[复制链接]
STMCU小助手 发布时间:2023-1-3 17:48

一、简介

TEA5767是由菲利普公司推出的一款低功耗立体声收音机接收器芯片。频率范围从76-108MHz自动数字调谐。高灵敏度,高稳定性,低噪音,收音模块。一片低功耗电调谐调频立体声收音机电路,其内部集成了中频选频和解调网络,可以做到完全免调。

电源 5V
. _& A9 b! K0 \5 _5 YI2C 总线通讯, E; {. s/ }$ a$ H9 U, i: F; y! E
可以使用软件进行静音和消除噪音

3 T8 B6 l; F' p0 R7 E) a2 q: B( E
二、硬件连接
4 j9 l% p- _1 w% P功能口    引脚/ c: \7 o6 j1 `. ~2 e+ x' m
SCL    PB.6. I8 o1 q; ^, I5 S) v: D0 u; _
SDA    PB.5


) _7 e( T" `8 q2 }三、添加I2C驱动4 S/ ~/ r, }$ h- {, w5 R

' U3 f0 c+ J3 C9 `4 T1 f

四、移植文件/ O/ X8 e# @: t: }% n- v$ a+ O
注意:以下出现缺失common.h文件错误,去除即可。uint8改为uint8_t或unsigned char或自己宏定义
4 u2 E. y# ?4 Z9 w4 {. V7 Y1 P
6 `) P8 |, d  q1 Q, V将 board_i2c.c、board_i2c.h、board_tea5767.c 、 board_tea5767.h 四个文件加入到工程


% m. G: u3 D2 r0 T0 S) X% F) {

4.1 board_tea5767.c: Q$ a/ S% O' P

  1. /*********************************************************************
    3 h, c6 Z% t0 o7 m$ C
  2. * INCLUDES
    7 Q# N0 h5 O  B5 O
  3. */
      J+ i% V/ b9 q$ X- v
  4. #include "stdlib.h"5 B2 ?: d4 z1 e
  5. #include "stm32f10x.h"+ O4 w3 u' g) e( p. T$ z8 a* C3 Y4 ]
  6. ; p2 V2 n+ u) S5 O3 ], P: @
  7. #include "board_i2c.h" ' ?  B& n& a5 a! _! }4 i" N
  8. #include "board_tea5767.h"
    9 D; |" f3 p) P, e  g" v
  9. #include "common.h"
    - G8 A! D( M$ _1 x4 |

  10.   i7 Z7 G6 m- e
  11. /*********************************************************************) x. c2 e. H, ^& x) H4 T- [
  12. * GLOBAL VARIABLES6 x8 b2 b! F$ Q# }. P) c0 R: c4 ]
  13. */
    : W8 H& }3 N+ r$ Y2 ~! L
  14. unsigned long g_frequency = TEA5767_MIN_KHZ;* z6 z/ y' o- R; s1 C; K

  15. 4 H' r6 _) ^$ {
  16. /*********************************************************************) L' Z$ P" r2 R0 ^/ Q
  17. * LOCAL VARIABLES
    4 A9 f3 M- L0 n( v' \
  18. */                                    
    0 }! f/ w. S5 i: h) N2 V1 k8 k9 M
  19. static uint8 s_radioWriteData[5] = {0x31,0xA0,0x20,0x11,0x00};          // 要写入TEA5767的数据,默认存台的PLL,104.3MHz, d' w- [! }1 s% m" R
  20. static uint8 s_radioReadData[5] = {0};                                  // TEA5767读出的状态; ?( y& Q5 K- T" E: k9 s
  21. static uint32 s_pll = 0;
    " E; q6 C6 e5 s; `3 u* w

  22. + X, c) ~& ?- v# g: U) S6 [
  23. /*********************************************************************+ ^1 W4 z; F% e# L
  24. * PUBLIC FUNCTIONS  y: v$ E( ^$ p' n5 b% ]$ w
  25. */
    8 B: B  |( Y2 A# e* C- g6 ?6 ]
  26. /**0 @8 r4 Z; Z) j, z3 C
  27. @brief 向TEA5767写入5个字节数据5 y  z2 l/ o5 X; t0 X$ u
  28. @param 无
    : Y: ^2 J4 t6 @' r( W
  29. @return 无+ x" [/ f) ^+ K9 C2 r$ q
  30. */' S4 r' X- D+ e( E8 `# D
  31. void TEA5767_Write(void)
      s5 e$ N& s/ M( R$ H4 T7 F- A
  32. {        
    1 J. V" I1 k) X( X8 R
  33.     uint8 i;; ^+ [; ~3 |+ s$ ~" Y9 E' q
  34.    
    + u$ q1 I8 U; O" c$ X0 o
  35.     IIC_Start();                                                        // 发送起始信号
    ; _) }& l5 @3 N6 ^$ V
  36.     IIC_SendByte(TEA5767_ADDR_W);                                       // TEA5767写地址/ q( e- `% c2 p5 }7 R. I  \7 X
  37.     IIC_WaitAck();                                                      // 等待应答
    / H- P7 n7 g3 v" X1 w3 x/ C5 Z; Z
  38.     for(i = 0; i < 5; i++)
    + g8 V! x/ c  q8 U
  39.     {$ b4 o, @: z% g0 C0 x1 B7 K
  40.         IIC_SendByte(s_radioWriteData);                              // 连续写入5个字节数据
    3 O6 @! K" L/ w% @9 g) p% W
  41.         IIC_Ack();                                                      // 发送应答* `2 j7 b# L% G9 ]
  42.     }
      f$ q) E4 K4 X8 B) v2 }
  43.     IIC_Stop();                                                         // 发送停止信号   . D6 H  ~! n+ T7 j0 [
  44. }, b" l; U) S" m

  45. 4 M9 z: n. V# x( Z# C$ v3 p
  46. /**
    ! L' G5 f6 v" O' y8 h
  47. @brief 读TEA5767状态
    * z8 a( b7 h$ r8 J, {- [
  48. @param 无$ r+ V) F; U0 n
  49. @return 无
    # V/ G3 L1 ^' G, R" O" a% w2 t
  50. */
    9 \% q% g/ {3 }
  51. void TEA5767_Read(void)
      O" a9 `1 s4 y/ R" b
  52. {
    0 @0 h7 j7 C1 M' V4 Q" E
  53.     uint8 i;  ~# z7 @/ M  T; l
  54.     uint8 tempLow;0 w6 I/ g& g+ d
  55.     uint8 tempHigh;
    % m1 ]" E0 K! y6 z" v
  56.     s_pll = 0;* c- K' B8 P  q
  57.     7 m! {- _1 p4 T4 u3 t5 Q
  58.     IIC_Start();$ E7 C6 A+ n9 Z. D: S- j: `
  59.     IIC_SendByte(TEA5767_ADDR_R);                                       // TEA5767读地址
    $ n, ?5 t  K3 X( W" e5 e" @% [1 \: D
  60.     IIC_WaitAck();
    ; \% H0 h3 V5 V! P' Z
  61.     for(i = 0; i < 5; i++)                                              // 读取5个字节数据
    5 V# W6 X$ J+ ^0 a
  62.     {
    ( {# Y8 e. X7 x
  63.         s_radioReadData = IIC_ReadByte();                            // 读取数据后,发送应答* W6 e2 f6 {) v: @0 t
  64.     }
    ( l2 S+ ]0 C, q" x' f' U
  65.     IIC_Stop();) S. B' O+ |5 I: c7 t
  66.     tempLow = s_radioReadData[1];                                       // 得到s_pll低8位
    ( O' J% Y5 X9 A4 E. `3 N
  67.     tempHigh = s_radioReadData[0];                                      // 得到s_pll高6位
    , _( r# x4 C9 l6 \8 F! A3 `
  68.     tempHigh &= 0x3f;
    ! M! i7 g5 U7 Z5 D1 y/ N& `8 \- J
  69.     s_pll = tempHigh * 256 + tempLow;                                   // PLL值 # R2 @0 Y/ c3 j
  70. }) _1 M* y" M  Y' v3 s% p- N3 a

  71.   ~2 u% w: U( ~, s8 j3 {
  72. /**
    1 O. h* d/ [( ^" I/ ]
  73. @brief 由频率计算PLL- u1 b3 D5 ?1 w/ T( j$ L
  74. @param 无. l: b* |4 K' R) B$ x
  75. @return 无& }/ ~9 c0 b0 \& R; s. n% q8 g# ^
  76. */( b& S9 D3 }# t5 P% ~
  77. void TEA5767_GetPLL(void)
    2 b# [# y" ^, ?3 W8 x! p
  78. {
    0 Y6 A+ C' s  D( D8 _. `
  79.     uint8 hlsi;9 @% L1 ^, m7 F, f, A
  80.     hlsi = s_radioWriteData[2] & 0x10;                                  // HLSI位, ~' u8 ?7 W: N/ j5 @0 M
  81.     if(hlsi)( u- s, J/ k9 h7 r9 O9 C( a# s
  82.     {
    & b8 r0 f1 A3 ~& ]7 i& N3 U6 H
  83.         s_pll = (uint32)((float)((g_frequency+225)*4)/(float)32.768);   // 频率单位:k
    9 ?; {5 `- z5 v, J' s- V+ b# e; E' ~
  84.     }
    5 l4 R; K; A' ]; r2 ?! J7 h2 g+ f5 d4 |
  85.     else
    8 d# X; }- ^  `. _
  86.     {
    9 E1 K) K! i% _$ }( M  N
  87.         s_pll = (uint32)((float)((g_frequency-225)*4)/(float)32.768);   // 频率单位:k
    8 N  H/ ?$ Z3 }7 Y
  88.     }  y1 l$ B% q8 Q0 Z6 E/ x4 s
  89. }
    ; }" L0 v1 F# @

  90. " i: i8 s) F" {) b; k! `
  91. /**
    6 v+ A" {) q1 b1 B0 [% ]0 D
  92. @brief 设置频率
    5 E' Y, r* o4 D$ q0 u3 P: C, l
  93. @param frequency -[in] 频率,单位:KHz9 q  l' V& h7 _% |" ]$ c
  94. @return 无) G% u( p$ O4 {- A$ E1 i4 X  Z4 }
  95. */- P0 R* P: @5 y1 L. m
  96. void TEA5767_SetFrequency(uint32 frequency)1 a6 C0 Q. Q1 g# h3 G3 O& G
  97. {
    & V; b  t! e+ I& `' x' E
  98.     g_frequency = frequency;
    / }' ?1 ], |1 o5 b& s$ {7 j
  99.     TEA5767_GetPLL();
    5 X3 I7 |6 W1 w& C) l) v
  100.     s_radioWriteData[0] = s_pll / 256;  Z7 c/ h# W. I
  101.     s_radioWriteData[1] = s_pll % 256;
    6 H, z8 o8 O) H' q! i" k) c7 }
  102.     s_radioWriteData[2] = 0x20;. L7 C8 C3 a2 o" a
  103.     s_radioWriteData[3] = 0x11;) b$ ]. B' ?1 ]+ S
  104.     s_radioWriteData[4] = 0x00;; H' E: @! @- N, w# R
  105.       Y' l7 X3 e* K2 h4 A! m
  106.     TEA5767_Write();. O. }4 W# l3 @4 {, b( |9 I  B
  107. }, `1 c7 n$ X8 F) y& x$ [- {
  108. 8 I5 \1 H! C, X. z+ J
  109. /**
    9 h0 @* A% x3 d% J
  110. @brief 由PLL计算频率
    5 q; ?2 a5 l+ b& I+ A( Y
  111. @param 无
    2 i0 L& J  I% x7 G% K3 `0 a
  112. @return 无
    3 @, Y% Z- V5 u5 `* g9 f
  113. */
    0 J4 a7 c* l0 H& b* K; B  }' k
  114. uint32 TEA5767_GetFrequency(void)& a9 q. j9 L7 o7 b
  115. {* |4 \% @$ E9 k& j4 q4 d
  116.     uint8 hlsi;& ^) p0 r# K1 U1 F' x0 W
  117.     uint32 pll = 0;5 n7 m$ U! m' C
  118.     pll = s_pll;* a+ r) Q1 ]+ f1 _
  119.     hlsi = s_radioWriteData[2] & 0x10;
    , |5 x0 L( h: S; a1 V
  120.     if(hlsi)2 a, b% O# ?' c4 \+ ~' d4 b+ l
  121.     {
    1 y* E% A9 r- z3 k+ h
  122.         g_frequency = (unsigned long)((float)(pll)*(float)8.192-225);   // 频率单位:KHz
    ; U2 H5 c1 ]0 C6 e1 z
  123.     }
      B$ V( D! u  Z& r4 e0 _9 l- S
  124.     else  w5 t8 G/ [$ A+ h2 F
  125.     {1 O, m4 A# _5 U$ O% G& B9 r6 ^. ~
  126.         g_frequency = (unsigned long)((float)(pll)*(float)8.192+225);   // 频率单位:KHz9 Z3 A5 b- g" k7 j; o
  127.     }
    + S6 j' T: @% z0 P& `0 j6 F, |
  128.     " L- t+ q$ E% W; ], c1 W
  129.     return g_frequency;7 b3 K# Q% H. U/ [5 P' |
  130. }2 {( ~5 `% V) b( R/ U1 h
  131. % p  \% Z5 x4 c& {# f# a" F  Y# Q6 {" U
  132. /**0 Y9 E% r5 a5 F3 v2 X
  133. @brief 手动搜索电台,不用考虑TEA5767用于搜台的相关位:SM,SUD
      ^, I5 T" s8 x
  134. @param mode -[in] 搜索方式,mode=1,向上搜索,频率值+0.1MHz;mode=0,向下搜索,频率值-0.1MHz
    ( q4 h/ c' T+ V( S6 f9 Y5 R
  135. @return 无
    ; X- G7 j! N) |6 \  U
  136. */
    ! l7 d; F1 j; f/ ~! C6 m% R
  137. void TEA5767_Search(uint8 mode): W3 `; i0 m- v% L: f" l" l
  138. {, [" k& P" U  G5 d& d- y! {
  139.     TEA5767_Read();                                                     // 读取当前频率值
    ' J; _4 o: W7 o9 h* h8 P5 R
  140.     if(mode)                                                            // 向上搜索
    9 K  x  @9 q' \" S; U
  141.     {
    : c3 r! b  R# D9 s- h$ V
  142.         g_frequency += 100;* f* J5 B' i+ z# e  Z& z
  143.         if(g_frequency > TEA5767_MAX_KHZ)                               // 频率达到最大值( c6 g. f8 v/ |8 N
  144.         {
    % C; V& I  F5 ]5 m- L7 o& T( }
  145.             g_frequency = TEA5767_MIN_KHZ;
    # o! A6 a+ }+ n1 w& P
  146.         }
    . p% `* ], N  ~" Q' W9 b8 @
  147.     }" \) u+ m( e; @) _$ C/ v
  148.     else
    - \4 E% _+ o$ E3 b  u3 l
  149.     {8 ], }5 r- o6 z
  150.         g_frequency -= 100;0 E% c, J3 m8 w
  151.         if(g_frequency < TEA5767_MIN_KHZ)
    " [' V  R# P0 E/ B/ u: N9 v! Q
  152.         {
    9 X2 w" A# D( a( ]) c3 H" ]
  153.             g_frequency = TEA5767_MAX_KHZ;# T4 s3 A/ g: h& L2 E9 }
  154.         }
    ) {6 l/ e, ~) @# S7 ?- d
  155.     }         
    ! J. o1 e$ n$ [
  156.     TEA5767_GetPLL();                                                   // 计算PLL值
    " q1 z. k5 g2 m  }- b1 b
  157.     s_radioWriteData[0] = s_pll / 256;
    ; @1 u* Z, z/ |
  158.     s_radioWriteData[1] = s_pll % 256;/ H2 N9 M2 F) h/ E4 g6 U
  159.     s_radioWriteData[2] = 0x20;
    . ^- G3 y5 Q# z3 u
  160.     s_radioWriteData[3] = 0x11;! N: l% z; V% R3 t
  161.     s_radioWriteData[4] = 0x00;8 ~( i# o9 J* `) R
  162.     TEA5767_Write();
    ! _4 j  ^' I' w
  163.     TEA5767_Read();0 X; C- k8 D+ w1 I. {
  164.     if(s_radioReadData[0] & 0x80)                                        // 搜台成功,RF=1,可保存其频率值待用
    7 {+ ^% o9 I, I
  165.     {7 D* p" a) W" d$ J0 E; B
  166.         printf(" frequency=%d\n", (int)g_frequency);6 F  H- n4 o7 j7 L" r% W
  167.     }   
    2 N* ?9 Z7 s  G
  168. }
    3 r+ e1 ^! @5 X% [7 m

  169. . v0 x" ~9 |1 G( o! u
  170. /**: c' I. i& b" a
  171. @brief 自动搜索电台
      J) M( [/ E& A/ t8 v% P- _
  172. @param mode -[in] 搜索方式,mode=1,频率增加搜台,频率值+0.1MHz;mode=0,频率减小搜台1 k1 C/ F# r, ~7 \
  173. @return 无% A6 B' E8 e, u. N9 t3 Y; N1 Z* F8 K* U
  174. */
    3 ~6 i7 J9 s1 q) s# [. X
  175. void TEA5767_AutoSearch(uint8 mode)' \6 f. ^$ [5 z! |$ D, I% V4 Y2 |8 Z
  176. {
    $ K: M( }( c9 s5 }+ Q
  177.     uint8 radioRf = 0;                                                    // 1=发现一个电台,0=未找到电台) |7 v; X: ?( s
  178.     uint8 radioIf = 0;                                                    // 中频计数结果1 \9 P! I4 M  r- k2 Q
  179.     uint8 radioLev = 0;                                                    // 信号电平ADC输出0 c$ v6 N  e; L) l1 e" `* k3 G
  180.    
    3 l- U( C0 k" t" V2 m0 P/ e) {
  181.     // 直到搜台成功,RF=1,0x31<IF<0x3E) A9 t) s& O9 P4 d3 a" o" p
  182.     while((radioRf==0) || ((0x31>=radioIf)||(radioIf>=0x3E)))
    & C6 c6 I, N0 k# f, B
  183.     {: S3 z& Y9 v# y) G) m
  184.         if(mode)                                                        // 频率增加搜台
    0 F1 t& R8 N, f& k6 N
  185.         {
    / n8 G) X5 c/ T1 U
  186.             s_radioWriteData[2] = 0xC0;                                    // SUD=1,SSLadc=7,HLSI=0
    + ?; [; F2 O( t' H- z
  187.             g_frequency += 100;$ i1 }7 A2 V8 T) ^
  188.             if(g_frequency > TEA5767_MAX_KHZ)                            // 频率达到最大值
    2 _6 Z# [% `, n% b
  189.             {
    ( M- g+ ?, ]( t; i$ \! h; S) U2 `
  190.                 g_frequency = TEA5767_MIN_KHZ;! A. r9 o1 a( R+ h: z" O
  191.             }( y" z6 X# V+ G7 R
  192.         }! L7 k1 B0 _" V& K7 v. h
  193.         else                                                            // 频率减小搜台
    # c, X+ e& m; t3 h& R0 A/ l
  194.         {
    ; _' K* |& }# R9 o1 p* K. \
  195.             s_radioWriteData[2] = 0x40;                                    // SUD=0,SSLadc=7,HLSI=0; Y5 N7 T$ X# m( @
  196.             g_frequency -= 100;: a$ Q; x! Z1 T. a* ]) X6 L/ N
  197.             if(g_frequency < TEA5767_MIN_KHZ)
    ' q0 n7 B8 ^/ y- O# S6 ?
  198.             {
    9 W, x9 O2 @/ ?2 K
  199.                 g_frequency = TEA5767_MAX_KHZ;
    : j* [' O( ~7 N3 H* L  b
  200.             }            8 N4 m! R) l8 x6 o0 e5 j# ^5 Z
  201.         }, ^" _0 F8 C" s
  202.         TEA5767_GetPLL();                                                // 转换为PLL值
    ! j" q# v, p! W' b0 Y7 \2 A- v
  203.         s_radioWriteData[0] = s_pll / 256 + 0xC0;                        // MUTE=1,SM=1' u+ f' K( `% a2 n* g; m
  204.         s_radioWriteData[1] = s_pll % 256;
    7 s* b' i+ U/ ^# h0 r
  205.         s_radioWriteData[3] = 0x11;* g' A% _2 ^+ ?7 W
  206.         s_radioWriteData[4] = 0x00;
    1 A, S$ `* n+ Q) K: N7 z
  207.         TEA5767_Write();                                                // 写入5个字节数据1 R' [2 S# x# N- ^6 ]* V
  208.         TEA5767_Read();                                                    // 读取当前频率值 % G4 }& u- S) B1 p! v$ t
  209.         radioRf = s_radioReadData[0] & 0x80;0 l! N) d7 [5 Z2 d4 b; s* k. w/ p
  210.         radioIf = s_radioReadData[2] & 0x7F;
    . O* }: A: L5 V& u! Q
  211.         radioLev = s_radioReadData[3] >> 4;
    $ D* Y; d2 w2 r- M
  212.         printf(" r=%02x\n", radioRf);
    7 ~+ B' Y' L  X* `( t+ u
  213.         printf(" i=%02x\n", radioIf);' ?9 V! [2 q0 _& p" t8 K1 m
  214.         printf(" l=%d\n", radioLev);6 Y0 @- R( D* r% F& b
  215.         printf(" f=%d\n", (int)g_frequency);
    $ P) x; K, z! j% Y8 i, ?$ N
  216.     }
    ( B! ~/ P* Z& A! `3 a
  217.     TEA5767_GetPLL();                                                   // 转换为PLL值; o3 s3 G/ U( k7 R7 ?
  218.     s_radioWriteData[0] = s_pll / 256;                                    // MUTE=0,SM=0+ C; ?4 `, o3 @0 f% Z
  219.     s_radioWriteData[1] = s_pll % 256;
    1 V0 X8 _; F! V: E2 u
  220.     s_radioWriteData[3] = 0x11;
    ) a$ K% z$ E; E% i) g6 x& V
  221.     s_radioWriteData[4] = 0x00;
    " S7 R' m# `& o. {2 p6 i
  222.     TEA5767_Write();                                                    // 写入5个字节数据
    4 E, a6 \. W- @* F
  223.     TEA5767_Read();                                                        // 读取当前频率值
    " Y9 E/ q% B0 k1 J' Q, B9 l7 {
  224.     printf(" frequency=%d\n", (int)g_frequency);
    ' q" Q& O  j# J  r$ s
  225. }
    9 G3 B# n6 _. O  p# [6 U2 y8 t
  226. % D& S) B- l  n5 i
  227. /**
    , h' n+ j9 }- d! o+ y9 H& ^- q
  228. @brief 静音
    1 [- K% }; {3 q0 V
  229. @param mode -[in] 静音方式,mode=1,静音;mode=0,非静音8 \4 K! v9 \+ G6 B7 T* }. {1 @
  230. @return 无
    & }, S% }' V5 I8 _
  231. */4 }* @. g: F' K
  232. void TEA5767_Mute(uint8 mode)
    1 A" C8 U/ Y' p
  233. {        ( i# u% `3 h9 I5 D
  234.     if(mode == TEA5767_MUTE_ON)4 r4 s. C4 n! F( k5 G& p% o
  235.     {' o! e+ P5 w3 O2 F
  236.         s_radioWriteData[0] = s_radioWriteData[0] | 0x80;8 O7 @# [% |& B/ J
  237.     }: d' f7 k0 M. V% X' {
  238.     else
    0 z. d4 Y4 z2 }6 v9 R# e5 X8 U
  239.     {
    7 X# F; |8 l/ G" B
  240.         s_radioWriteData[0] = s_radioWriteData[0] & 0x7F;% ?( G& w9 J5 u
  241.     }) D* [9 @5 L5 w" h4 ~' K( g
  242.     ( l# @, P3 T! H2 e4 U7 g
  243.     TEA5767_Write();
    $ f! c% {( A) S3 F% A
  244. }
    # @* t6 h2 |: n) n% X9 a4 a2 p% V
  245. 6 x+ v5 o2 I, q# s2 G
  246. /****************************************************END OF FILE****************************************************/
复制代码

/ \9 R) l9 @# f; S3 Z, m

4.2 board_tea5767.h; }( p+ g/ f0 V( }

  1. #ifndef _BOARD_TEA5767_H_) r; L, V7 b' ~  k$ v: U1 l
  2. #define _BOARD_TEA5767_H_
    & l8 w. H% H# V
  3. , I+ W. ^- ~: j$ L  ^8 _4 c' i
  4. /*********************************************************************
    ; Z6 a$ M. \* x9 F5 m
  5. * INCLUDES
    9 }5 V# h# f1 Q9 f" o/ p0 X
  6. */
    3 |" f* m1 g) h( ~9 L! I9 E; V( ]
  7. #include "stm32f10x.h"
    - R6 J7 h5 w* K% z# q" t  k

  8. 3 F/ |( y" b2 ]
  9. #include "common.h"
    4 X; {) e. d* ?1 S
  10. 2 Y' U* g7 N) p4 V1 F: G, o6 [
  11. /*********************************************************************' ]6 {$ k8 T/ x
  12. * DEFINITIONS, n8 a! `. h6 D* ~
  13. */
    3 s7 G4 X" w( M$ B
  14. #define TEA5767_ADDR_W      0xc0    // TEA5767 写地址5 e% K# I" I$ ]) z- L4 [$ m9 C
  15. #define TEA5767_ADDR_R      0xc1    // TEA5767 读地址8 B- A- j7 \# F; @

  16. . i2 _5 ^  e2 N  ?6 {5 S8 X
  17. #define TEA5767_MAX_KHZ     108000  // 最高频率 108M1 I( y. I! y$ r6 A
  18. #define TEA5767_MIN_KHZ     87500   // 最低频率 87.5M9 H* W5 K% L) i" m& u" t
  19. * e  u- t$ W/ ~" R; h' g
  20. #define TEA5767_MUTE_ON     1       // 非静音# e6 W$ r$ u$ x* c) r9 _" A9 B
  21. #define TEA5767_MUTE_OFF    0       // 静音4 _7 A1 b) U& q/ ]  p  t$ n
  22. / V* A$ n, x* A1 M- V+ N3 a
  23. #define TEA5767_SEARCH_UP   1       // 向上搜索) ?* t% w2 r. v9 L2 i0 v- r
  24. #define TEA5767_SEARCH_DOWN 0       // 向下搜索0 L) |' d5 D* [3 H3 `1 Q$ o" E

  25. 7 r6 r) k) _( {6 Q5 J( e
  26. /*********************************************************************
    9 f5 o+ Q5 g6 B7 p8 T
  27. * GLOBAL VARIABLES4 J5 M2 J0 H6 O
  28. */
    + v! q' m& u4 A+ F+ s
  29. extern unsigned long g_frequency;/ Y1 Y: g$ S' T, H! R# [+ F" D& ~" ~3 b

  30. + g- S- ?* ]/ {) S3 a8 l/ [' _
  31. /*********************************************************************
    ' o- [% y2 Q- H: |, z
  32. * API FUNCTIONS. [% F5 P$ m7 z. w
  33. */# }* d( ^; h! m
  34. void TEA5767_Write(void);
    / H9 M- Z. e# g  o  b" V
  35. void TEA5767_Read(void);5 K7 l) k) Y$ F' Q" c  H
  36. void TEA5767_GetPLL(void);
    - p- j5 U9 _5 E5 n1 ^
  37. void TEA5767_SetFrequency(uint32 frequency);
    & J8 o0 H- E; q8 n# T1 x' D  P
  38. uint32 TEA5767_GetFrequency(void);
      O/ H  Q2 c4 m$ g5 `' b$ j! Q0 K: r4 x
  39. void TEA5767_Search(uint8 mode);' e$ e' B/ O* ]+ h7 V# t$ @
  40. void TEA5767_AutoSearch(uint8 mode);! T  R% [& @  K% w/ U- H
  41. void TEA5767_Mute(uint8 mode);. u6 p9 ]% ~" ^7 |( a

  42. % r( d+ h+ \: N7 R" M' Q
  43. #endif /* _BOARD_TEA5767_H_ */
复制代码

" A9 u3 [+ o7 E) e" A9 {3 F5 b" T

五、API调用7 b9 e$ N4 H- h% o
需包含头文件 board_tea5767.h


, A! e" s; Z% y, G, @

TEA5767_Write


" c+ E+ V& l1 W: \! z

功能    向TEA5767写入5个字节数据
3 J- f, K8 H, s$ [" I7 x3 m! E- s函数定义    void TEA5767_Write(void)/ D* t; U3 _& \3 G6 D
参数    无
+ [- f' s6 c" b1 H- T- h返回    无
6 Z5 c  _4 I- iTEA5767_Read


; H* C5 A9 G: S6 O3 g6 O

功能    读TEA5767状态# ~+ m/ L5 W3 a% O% O- n/ \
函数定义    void TEA5767_Read(void)
" x+ D3 |# I. U$ K, }% J. ~参数    无8 g4 g7 P, J4 V; @, i3 ?; |: H1 f
返回    无
$ Z3 p9 y8 b) g; R6 vTEA5767_GetPLL

$ N9 t6 h  j, W" Q

功能    由频率计算PLL
% Z6 F# Z/ p7 R函数定义    void TEA5767_GetPLL(void)' A- w+ h, @- y7 r- j( v
参数    无1 s/ g- ^2 t: b9 @9 w, F: j
返回    无7 Z* z! s) x# r: x+ \
TEA5767_SetFrequency

8 Z0 B. P. n5 c* X1 b5 I

功能    设置频率: A$ O4 l- y* \+ J5 q! E; B
函数定义    void TEA5767_SetFrequency(uint32 frequency)
: H1 i0 Y1 C- w9 L% S: p参数    frequency:频率,单位:KHz1 [8 |- T  S! F$ h
返回    无
4 Q* H) k# B6 ]4 HTEA5767_GetFrequency


; P/ n0 ^- ]7 g! x

功能    由PLL计算频率
0 ]+ J' L1 t3 ]6 I' ]函数定义    uint32 TEA5767_GetFrequency(void)# M3 T& O' r" C2 n6 j
参数    无& L- n! d- S2 c' L7 j' d
返回    当前频率# y. C- M  `% {! L; j+ w
TEA5767_Search

2 W; X' y& z& i

功能    手动搜索电台,不用考虑TEA5767用于搜台的相关位:SM,SUD0 O. E& _4 z6 ^6 f
函数定义    void TEA5767_Search(uint8 mode)
+ N* Q* b  D! i* B! m; _参数    mode:搜索方式,mode=1,向上搜索,频率值+0.1MHz;mode=0,向下搜索,频率值-0.1MHz
8 ?" |& [1 J. W- e: m, F( [' d8 z返回    无3 D2 j1 n1 z$ \) f/ g3 ]  J
TEA5767_AutoSearch


) ?* X0 ^% A; Y' m" q- ?

功能    自动搜索电台4 x1 h1 \# ~$ }0 K# c' z5 p7 s
函数定义    void TEA5767_AutoSearch(uint8 mode)
/ x) ^- u4 n4 e3 c0 ?  i, {4 L( N参数    mode:搜索方式,mode=1,向上搜索,频率值+0.1MHz;mode=0,向下搜索,频率值-0.1MHz' C( T/ m! i! y. L3 e
返回    无
" y: _# q' q0 R% N) g. _TEA5767_Mute


0 I7 O; _7 U% P/ G

功能    静音
2 g# o+ h7 A! S+ L% P! {( [函数定义    void TEA5767_Mute(uint8 mode)6 \# H2 @  m, B4 X" w. i  p. q) M
参数    mode:静音方式,mode=1,静音;mode=0,非静音
" z; t, u: l$ [/ d) x  ^返回    无

' G2 y0 u& l" M
六、使用例子* u4 w1 c* E1 A
6.1 手动加减台

$ E+ t6 F; q1 ]+ U) ?& d±0.1MHz,87.5-108MHz,循环增减

  1. TEA5767_Search(1);  // 加台1 O) C' M  z7 v6 F8 I
  2. TEA5767_Search(0);  // 减台
复制代码


7 N% W6 @, d5 M6 b& x6.2 自动搜台

( ^6 e4 [$ I( a$ c3 [$ Z- ^& ^/ q由于从IC中读回的频率不准,这里采用静态变量g_frequency来记录当前频率,87.5-108MHz,循环增减

  1. TEA5767_AutoSearch(1);  // 向上搜台
    : O2 }$ O0 V- H+ I0 ?) _+ |
  2. TEA5767_AutoSearch(0);  // 向下搜台
复制代码


$ \2 g  z- F) k6 S; {" Y8 y参考自动搜台流程:

% `! a4 e. o+ B3 n( Y
由上面流程可知,决定参数有

rf:1=发现一个电台,0=未找到电台
7 s. ^" |# I& B0 lif:中频计数结果,0x31<IF<0x3E则为符合电台1 T& B# C, a" _& L, l, P4 q
lev:信号电平ADC输出,可通过写入的5个字节中对应SSLadc的位(查看下面附录),下面SSLadc=7
8 p" m, z% r4 i; s9 l+ a6 O

  1. void TEA5767_AutoSearch(uint8 mode)
    ; o) g( w( I. O  r& `9 A
  2. {
    # V; i6 {- |! c4 I2 _. c; x
  3.     uint8 radioRf = 0;                                                    // 1=发现一个电台,0=未找到电台
    . v2 [  s8 N; y7 x! P! a$ W
  4.     uint8 radioIf = 0;                                                    // 中频计数结果
    ! r. o  x4 O" {( b$ I
  5.     uint8 radioLev = 0;                                                    // 信号电平ADC输出
    2 }# f4 D0 @+ O! O$ i3 c+ Q
  6.     - n+ M3 y3 G0 V6 ~: w
  7.     // 直到搜台成功,RF=1,0x31<IF<0x3E
    7 w8 R; V' |9 I( R( ?
  8.     while((radioRf==0) || ((0x31>=radioIf)||(radioIf>=0x3E)))- }8 ?0 F3 e2 J4 O( Z+ l
  9.     {
    " u. d- V. ?+ v( {
  10.         if(mode)                                                        // 频率增加搜台
    ( U! O( @% V* \9 y# {8 l
  11.         {/ K5 k4 v! Q' _
  12.             s_radioWriteData[2] = 0xC0;                                    // SUD=1,SSLadc=7,HLSI=0$ d2 o$ f8 v# J! g) l0 e
  13.             g_frequency += 100;" a& _! w$ X" {' L2 ]
  14.             if(g_frequency > TEA5767_MAX_KHZ)                            // 频率达到最大值0 j8 d1 y( e1 `: }+ {. A/ |
  15.             {% Y9 @3 J! N, H0 b7 n) q; F
  16.                 g_frequency = TEA5767_MIN_KHZ;$ ~- Q! @9 r' n7 X$ h; |9 |% H  p$ m
  17.             }' w1 [. L) \1 ~9 R/ k2 `1 G" i$ e
  18.         }0 l$ ?& x- q9 X5 r$ f$ W
  19.         else                                                            // 频率减小搜台0 E4 Y% s- v7 b6 @
  20.         {
    , c: ?  i0 G3 ?+ ~
  21.             s_radioWriteData[2] = 0x40;                                    // SUD=0,SSLadc=7,HLSI=0
    8 I9 w" f8 @" p0 B
  22.             g_frequency -= 100;+ i/ y6 {2 L7 l# X) s+ U1 G
  23.             if(g_frequency < TEA5767_MIN_KHZ). Z8 ~/ ~, V6 Z$ n3 b$ B5 o
  24.             {
    * a# l- S* z. V% T. b) F* Y
  25.                 g_frequency = TEA5767_MAX_KHZ;4 T# m% N- T* g5 P! G* I- a& V5 h
  26.             }            
    3 S) y7 g8 Q6 R" P
  27.         }1 _: Z$ {6 v3 S) R6 c: R
  28.         TEA5767_GetPLL();                                                // 转换为PLL值
    ) [; D5 ?+ E4 J: V& T
  29.         s_radioWriteData[0] = s_pll / 256 + 0xC0;                        // MUTE=1,SM=1" a1 C0 g0 n. d$ m+ Q9 a/ |* r
  30.         s_radioWriteData[1] = s_pll % 256;
    9 I3 v- N* F# @8 ^5 t; C
  31.         s_radioWriteData[3] = 0x11;
    - l( E* [) H# A* x) m( t- A- j& Q0 ~
  32.         s_radioWriteData[4] = 0x00;
    1 b5 C) D( P- J
  33.         TEA5767_Write();                                                // 写入5个字节数据" P( V3 l# d) O3 P' S
  34.         TEA5767_Read();                                                    // 读取当前频率值 1 o/ z$ p9 v+ }& }+ {
  35.         radioRf = s_radioReadData[0] & 0x80;
    1 q( e6 j4 r" `" _: |; P
  36.         radioIf = s_radioReadData[2] & 0x7F;
    ) o8 |& u2 H& t* _: @% [* {5 `/ @
  37.         radioLev = s_radioReadData[3] >> 4;
    ; `& H8 z# `) h, n; ~& Q- g7 F
  38.         printf(" r=%02x\n", radioRf);) X& J9 J! m% U: A
  39.         printf(" i=%02x\n", radioIf);3 _- h+ M2 @$ x  p) G) Z0 v
  40.         printf(" l=%d\n", radioLev);
    2 i' X9 T) x2 z* L% C/ F
  41.         printf(" f=%d\n", (int)g_frequency);( c9 ^9 U, i+ w% q" T
  42.     }
    : L, c/ \+ R. l8 x  W
  43.     TEA5767_GetPLL();                                                   // 转换为PLL值6 _% i; g! D! P6 E
  44.     s_radioWriteData[0] = s_pll / 256;                                    // MUTE=0,SM=0
    + ?# H% \9 F+ F3 F9 R$ p
  45.     s_radioWriteData[1] = s_pll % 256;
    3 E, |/ q2 `1 C$ G
  46.     s_radioWriteData[3] = 0x11;
    3 F7 c/ H' K% D
  47.     s_radioWriteData[4] = 0x00;
    0 M9 A. `3 [% R( d3 R( _# V( J
  48.     TEA5767_Write();                                                    // 写入5个字节数据
    2 U; G" M# ?: T9 N  `; H' {4 a
  49.     TEA5767_Read();                                                        // 读取当前频率值
    0 S1 }$ r* @( M' N* `
  50.     printf(" frequency=%d\n", (int)g_frequency);
    - j/ U1 Z( o. k) x
  51. }
复制代码
: c- _4 t- ^6 ]( c8 l; ~

6.3 软件静音
" v/ x7 a) W! k6 P! u* r  B* s0 [' K

  1. TEA5767_Mute(TEA5767_MUTE_ON);      // 收音机静音2 Y7 Y+ I6 }$ H$ t8 I+ W
  2. TEA5767_Mute(TEA5767_MUTE_OFF);         // 收音机开启收听
复制代码

" Y) e9 z! r# T% k% I
七、附录5 |; T8 A% w) k1 n1 |
7.1 写数据

! z: j2 V# K' B- e向TEA5767 写入数据时,地址的最低位是0,即写地址是C0。读出数据时地址的最低位是1,即读地址是C1。TEA5767的控制寄存器要写入5个字节,每次写入数据时必须严格按照下列顺序进行:. y" J- i  L4 d& g: j
地址、字节1、字节2、字节3、字节4、字节5。


4 H5 M: z; i: |

每个字节的最高位首先发送。在时钟的下降沿后写入的数据生效。上电复位后,设置为静音,所有其它位均被置低,必须写入控制字初始化芯片。

! v  ?* \4 W) a& C" W

TEA5767内部有一个5个字节的控制寄存器,在IC上电复位后必须通过总线接口向其中写入适当的控制字,它才能够正常工作。每个数据字节各位的功能含义见表4到表14。

6 s& `+ B" ~. J3 ~

表4 数据字节1的格式

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)9 b" X9 ^& d5 D* v& @9 v) i
MUTE    SM    PLL13    PLL12    PLL11    PLL10    PLL9    PLL8
2 W" l) N0 @: J" T! x4 z表5 数据字节1各位的说明


: g; u; }6 n% t6 @  ~; {' [) g

BIT    SYMBOL    说明+ o2 d; ^! ]4 z; l
7    MUTE    若MUTE=1 左右声道静音;若 MUTE=0 左右声道非静音
+ a+ S8 o: g% m6    SM    搜索模式;若SM=1 搜索模式;若 SM=0 非搜索模式
" M. q9 d' q& T8 H0 a5 to 0    PLL(13:8)    预置或搜索电台的频率数据高6位3 F9 P6 ]& h# l% }
表6 数据字节2的格式

  I- o8 r0 J3 X4 g9 r

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)4 z9 K: a. _$ U# H! l6 ^# z
PLL7    PLL6    PLL5    PLL4    PLL3    PLL2    PLL1    PLL0! T1 _+ \4 ?  X
表7 数据字节2各位的说明


9 M- L  M  f* Z

BIT    SYMBOL    说明: E6 ]7 d) ~7 {. {
7 to 0    PLL(7:0)    预置或搜索电台的频率数据低8位0 v2 V! k! M3 }% X4 O' o. q5 |( ]
表8 数据字节3的格式

, @8 M0 \- q. M, w! b

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)
& t& K! Y+ C$ kSUD    SSL1    SSL0    HLSI    MS    ML    MR    SWP1; I) [/ a0 V2 j1 w
表9 数据字节3各位的说明

$ q9 D; w& i5 d: f% C  g

BIT    SYMBOL    说明7 N0 q2 e' W9 t  ^$ L; v
7    SUD    若 SUD=1 向上搜索;# P8 `6 W) c* s. r
若 SUD=0 向下搜索7 ^9 g3 G3 C2 G
6 and 5    SSL[1:0]    搜索停止电平:见表10-119 J0 V! n. j, X4 U
4    HLSI    若 HLSI=1 高端本振注入;* Y- w9 ^  c7 f0 L
若 HLSI=0 低端本振注入* E1 K2 C  W) w' `$ v* k8 \4 G8 S
3    MS    若 MS=1 强制单声道;, L: _5 N% d7 t
若 MS=0 开立体声
3 E6 e* d0 _7 P+ E2    ML    若 ML=1 左声道静音强制单声道;
% M- r: |+ O9 a( f1 O8 p若 ML=0 左声道非静音
' L* H, E6 v5 T; {/ Z& u% P6 \1    MR    若 MR=1 右声道静音强制单声道;/ u9 ]+ Z" `( U# A' Z: B
若 MR=0 右声道非静音
8 k  x1 y3 h  n8 K- I1 f. G0    SWP1    软件可编程输出口1:若 SWP1=1 SWPOR1为高;
8 H9 e, v2 m' |若 SWP1=0 SWPOR1为低
7 A; _( Z3 Z9 M$ J/ h0 V% C  t' ^表10 搜索停止电平设定


- v! Y& s% z# K* U) R+ ]

SSL1    SSL0    搜索停止电平7 l0 t% V; U1 Z+ C
0    0    不搜索$ F7 Y6 d- w0 B2 v' g
0    1    低电平 ADC output=5% Q+ G, D5 C( `0 W
1    0    中电平ADC output=7
: e/ x+ m, O2 r2 O1 d1    1    高电平ADC output=10
0 E+ b1 [* n) s' t表11 数据字节4的格式

5 F2 F, T6 `& ~% f: \* R

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)) Q7 ~2 j' m) l  A2 T. t1 x  Y* k' C
SWP2    STBY    BL    XTAL    SMUTE    HCC    SNC    SI0 S7 s* E" D/ e
表12 数据字节4各位的说明

5 @7 D3 M1 J( G1 c

BIT    SYMBOL    说明
, q7 N5 x' u/ v2 a7    SWP2    软件可编程输出口2:若 SWP2=1 口2为高;
1 r' V( Z5 ]/ c* I+ d) S若 SWP2=0口2为低# A, v4 w; l% [! Y! I, v& e
6    STBY    若 STBY=1 待机模式;9 N7 z# p6 Y& k( t2 C# @2 z
若 STBY=0 非待机模式# y' ^- H. J7 w* [$ v' R- g/ t
5    BL    若 BL=1 日本FM波段;
' C: F! X) g8 F; I5 z若 BL=0 美/欧 FM 波段7 p& R# K# c0 C6 S$ {
4    XTAL    若 XTAL=1 fxtal=32.768KHz;
6 j; {; j2 K0 m3 f3 r若 XTAL=0 fxtal=13MHz( i" i$ u, u1 [& O" l7 o! A
3    SMUTE    若SMUTE=1 软件静音开;
. E7 S3 X: P: v; U8 A若 MUTE=0 软件静音关
7 W* z; o& \9 R* }4 W2 D5 O2    HCC    若 HCC=1高音切割开;
2 s) R5 ~* ]  q- q8 [8 a8 c若 HCC=0高音切割关
" G- V- b& a; s) }" z1    SNC    若 SNC =1立体声噪声消除开;* y/ @( k0 d" b# n0 k
若 SNC=0立体声噪声消除关
4 }  p4 I* ~9 n/ x, {0    SI    若SI=1 引脚SWPORT1 作ready flag输出标志;
) c- v  F, q  H$ S2 x若 SI=0 引脚SWOPRT1 作软件可编程输出口
" n, u6 I9 @- b6 L5 u/ {表13 数据字节5的格式

- p: O0 g4 X& M5 L

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)
" _. n" H9 c$ b* bPLLREF    DTC    -    -    -    -    -    -
+ }/ m9 [! q/ f$ n& D  U' q! J表14 数据字节5各位的说明

( c/ R2 X9 n- z- {- \

BIT    SYMBOL    说明
6 v3 b1 F% E8 g' D7 D$ c% H/ _7    PLLREF    若 PLLREF=1 则6.5 MHz 参考频率 PLL可用;
- E$ F; U' i+ {+ f) J) ?" G若 PLLREF=0 则6.5 MHz参考频率 PLL不可用
# g7 r: @1 k; N6    DTC    若DTC=1 the 去加重时间常数为75μs;
$ X5 M2 {  X( ~3 P) `! Z( D5 S若 DTC=0 the 去加重时间常数为50μs1 {2 V2 h! ]* g, O% ]0 p. r
5 to 0    -    不用管它


& ~$ w7 `- G% Q0 c0 p7.2 读数据
3 X1 B( `* p7 F9 ~" D8 ]和写数据类似,从TEA5767 读出数据时,也要按照“地址、字节1、字节2、字节3、字节4、字节5”这样的顺序读出,读地址是C1。读出的5个字节的含义见表16到表25中的说明。

! z  a( e8 ^. K2 _# M2 I2 l) w

表15 读模式

数据字节1    数据字节2    数据字节3    数据字节4    数据字节5

$ X; H! h  G( d: [* E; \
表16 数据字节1的格式

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)
2 v- `- _4 U0 K7 R4 LRF    BLF    PLL13    PLL12    PLL11    PLL10    PLL9    PLL8

9 @) n  q7 P1 @
表17 数据字节1各位的说明

BIT    SYMBOL    说明- I, I- b7 C: I' i
7    RF    若RF=1 则发现了一个电台或搜索到头;# p/ g# X: z" ]; l
若 RF=0 未找到电台9 ]1 L" j' ~  |9 C  i. `8 k! G) g
6    BLF    若BLF=1 搜索到头;- d/ j$ J3 Q1 s% n
若 BLF=0 未搜索到头
+ J) C5 F* C( h3 J; x5 to 0    PLL[13:8]    搜索或预置的电台频率值的高6位


$ u: S5 n0 ~8 z/ Q, h表18 数据字节2的格式

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)
) ^. J' W# G0 K1 GPLL7    PLL6    PLL5    PLL4    PLL3    PLL2    PLL1    PLL0


0 p4 c0 ?$ @/ o: k表19 数据字节2各位的说明

BIT    SYMBOL    说明) T% i( X+ N, s9 H8 I
7 to 0    PLL(7:0)    预置或搜索电台的频率数据低8位


% t4 L) W6 `% \: v4 B- _& b表20 数据字节3的格式

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)
% x/ ~/ M) ~: o2 {3 j2 fSTEREO    IF6    IF5    IF4    IF3    IF2    IF1    IF0

( ]+ D3 V) A8 e1 o
表21 数据字节3各位的说明

BIT    SYMBOL    说明
+ S! o% y6 x" Q9 y' r7    STEREO    若 STEREO=1 为立体声;% d) y9 N7 Q3 \: S5 |3 o
若 STEREO=0 为单声道7 e7 v( e* n1 n0 ~9 Y3 S" f
6 to 0    IF[6:0]    中频计数结果

4 }1 x5 ^1 X! ?- `
表22 数据字节4的格式

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)6 h/ Z9 f" W: G& _& F
LEV3    LEV2    LEV1    LEV0    CI3    CI2    CI1    CI0


& I1 Y6 Y; T* ?. Q, ]1 N" d9 z表23 数据字节4各位的说明

BIT    SYMBOL    说明2 ]- H( g. c" n! \( ~6 E$ _
7 to 4    LEV[3:0]    信号电平ADC 输出/ E9 n, Q2 \- |' d( w1 }4 T) K
3 to 1    CI[3:1]    芯片标记; 设置为0
+ e& N7 \* ~8 m' b6 ?" F0    -    该位为 0


- |& r( ^  [) Z8 [  C8 l表24 数据字节5的格式

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)
) h9 d  T. [0 D1 d+ p1 E4 k) L5 X+ g0    0    0    0    0    0    0    0

" c* ~  o( @7 X; }% o* Q
表25 数据字节5各位的说明

BIT    SYMBOL    说明
9 E7 `9 R' y4 e- K( D# O7 to 0    -    供以后备用的字节;设置为0

5 `1 X$ {$ h$ D( G$ f& n: u" I# O
7.3 举例4 u! t* p4 X  B
根据上面的算法,以106.8的天津交通台为例,它的PLL为32d1H,第一个字节的BIT7=0非静音,BIT6=0不搜索,第三个字节的BIT4=0低本振,第四个字节的BIT5=0欧美制式,BIT4=1用32768晶振,其余位的设置无所谓,可任意。各字节值见表27~31。


% [! \  ~+ n  c& m  \1 a$ }% e1 d4 O

表27字节1:0x32

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)4 \! f" p& e" p
MUTE    SM    PLL13    PLL12    PLL11    PLL10    PLL9    PLL8
+ m) d8 `$ F8 V" |8 [: t5 M0    0    1    1    0    0    1    0
" Q+ h( F0 ]" S6 \非静音    非搜索    3        2      

        P* r  Z* U- H# X4 n1 J
表28字节2:0xd1

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)7 }+ b: Y+ l# Y. D
PLL7    PLL6    PLL5    PLL4    PLL3    PLL2    PLL1    PLL08 |6 Y6 l6 _  i  p6 N
1    1    0    1    0    0    0    1+ A1 S6 h0 `* l* A( B: B
d                1         

   
( |* W( g- h$ {! ?# ]& ?表29字节3:0xc0

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB): |; F6 r& j( |; o3 }6 e
SUD    SSL1    SSL0    HLSI    MS    ML    MR    SWP1
3 p/ j5 r% `( Y4 O1    1    0    0    0    0    0    0
# M+ S4 Q0 a( L- h7 b向上搜索    搜索停止中电平        低本振    立体声    非静音        随便

- D/ o4 n5 m2 q7 r! Y7 I
表30字节4:0x17

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)# ?7 N, }7 d; g1 n6 ?* R7 x" b
SWP2    STBY    BL    XTAL    SMUTE    HCC    SNC    SI
# F; C( v* d% t( p0 Z0    0    0    1    0    1    1    1* ]- R4 Q9 v% h, _
任意(不用)    非待机    欧美    32.768    非软件静音    高音切割    除噪声    SWP1=RF

* }9 Y  }6 D% M, \
表31字节5:0x00

BIT7(MSB)    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0(LSB)2 ~8 e( s( @) M) t( T1 N3 X
PLLREF    DTC    -    -    -    -    -    -
/ {6 g: }; n/ e' {2 D, o! ~% _& T0    0    0    0    0    0    0    0
7 h& J, Z+ C4 x4 G不用6.5M    50μs                        
# Y  U- ?3 h: W0 a% ?据此给出的控制字是:0x32,0xd1,0xC0,0x17,0x00,将这个控制字写入TEA5767就可以了。

————————————————
) a& O$ h$ E# K& e, y, [版权声明:Leung_ManWah

收藏 评论0 发布时间:2023-1-3 17:48

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版