找了一下网上的驱动程序,就一份程序被抄来抄了,有啥意思?。作者还不愿意把源代码公布,把电路和程序弄得又复杂,还要加上拉电阻,软件读取数据还要配置MOSI为开漏输入,心累。所以自己改了,现分享出来!
. k' i2 A. }& ]( [( B: i0 L+ X9 ~* a9 p0 w) e
I4 ^ _) \# m8 A
硬件平台:Nucle64-103,使用SPI正常读取即可
8 [( I' q8 \ v7 S6 @- ~+ `4 b1 _( ^* N& H x& x
硬件连接:8 `; p" Y. V6 I; K
+ b! X" t" a; @1 C/ L5 M软件平台:STM32CubeMX+keil5.0+hal固件库
. a! h4 c. _" W
' M# r/ W: }9 E; D9 z- #include "app_tle5012b.h"4 h& ^; w3 u, d3 f& A
- : W7 R: Z% D, E
- 3 E, O: r# Z! _- l
7 c1 }8 m* h2 j6 @0 I- W2 \- uint16_t SPIx_ReadWriteByte(uint16_t byte)+ Z) ^3 T( k6 ^6 y$ ]
- {4 E8 o; _$ p; E# M* I5 [
- 7 `; f+ e s& ^# O
- uint16_t read_value = 0;
5 {+ I" u. s! |! c. j& o3 J2 w -
3 Z1 g" d$ B' }6 Q2 L - HAL_SPI_Transmit( &hspi1, (uint8_t *)(&byte), sizeof(byte)/sizeof(uint16_t), 0xff );+ C- F, Z* S( G* }) I6 U2 O
-
$ E3 o3 W9 `; x8 s8 o; M - HAL_SPI_Transmit( &hspi1, (uint8_t *)(&read_value), sizeof(read_value)/sizeof(uint16_t), 0xff );
$ i- n$ a" v! ]$ X3 i - return read_value;" @$ [" t' u3 h9 F7 I% w: s* e7 S0 S" ]
- }, n8 ?+ l$ n: Q! o G; S0 z+ {
- : z7 U) y4 |: O4 N
- , ?) v% l/ Z, {) ~, G8 C2 [1 `& e' j$ ]
- double ReadAngle(void)5 S6 t; ]/ m V) u" ~! e
- {4 I/ o* s! h9 X1 F( E
- return ( ReadValue(READ_ANGLE_VALUE) * 360.0 / 0x10000 );
( ^2 |# }: P g. K- E$ d3 Q - }
8 W+ ~- j0 W0 J$ U* u M -
7 s2 `; m4 ?1 m* R9 w# [5 W - 2 o5 h l% h: t2 Q* P6 t W
- uint16_t ReadSpeed(void)
5 e( e8 P2 H$ k2 P( t - {1 @8 \ G( @$ O5 r) A8 _* v9 V
- return ReadValue(READ_SPEED_VALUE);; E; ^# {9 B% _3 T" z. [8 m" J
- }5 F3 } R1 s; ~% P: z
- " ^3 ?! T" u7 |- Z! D0 Z
-
( C% z# |( w% ~7 i( N, X. I - uint16_t ReadValue(uint16_t u16RegValue)# ]) G! G# U# k6 v, b
- {
; W9 A% h) g" L4 O8 Q - uint16_t u16Data;4 `3 z9 W, F% l& T Z
-
( S5 Y7 g; s& g - SPI_CS_ENABLE;, ~% V6 W0 i3 K I5 e5 p
- + p/ V4 r U9 g
- HAL_SPI_Transmit( &hspi1, (uint8_t *)(&u16RegValue), sizeof(u16RegValue)/sizeof(uint16_t), 0xff );
9 L( B. `" M" r. q- Y& [1 j - HAL_SPI_Receive( &hspi1,(uint8_t *)(&u16Data), sizeof(u16Data)/sizeof(uint16_t), 0xff );) I5 y e8 I7 L& i& f0 t2 R1 i" E% H
- ' p: K/ i. E! D( [9 y
- SPI_CS_DISABLE;- O3 X0 ?6 A$ ?; K( D7 X) F
+ \: K% o& C7 u Y-
, {- z: P! c) O+ R0 M - return((u16Data & 0x7FFF )<<1);& j0 Q$ V7 d1 l0 `$ l
- }. d5 l% K! W0 C) [- @; v
- 5 u" T: a9 j; p+ q. L& j; ?5 j7 N! X
- 3 t7 }: i, z' {, ^ e
- 2 `3 u9 {' \9 B( ^8 f" v4 s
复制代码- #ifndef _APP_TLE5012B_H_& A; M+ Q; q, O5 F8 I& w6 m
- #define _APP_TLE5012B_H_: C8 }9 ~" a5 N, I0 C
. h' L; [& h- ~# u5 V5 q$ r- #include "cpu_common.h"
! _+ h3 A- w1 U( l3 y+ P
7 q! b7 a+ h# k- 5 ^# q+ C, i. I
-
# Q+ C$ R2 [* Y" O) Q - #define GPIO_CS_Pin_Name GPIO_PIN_40 I- e3 x0 E3 S
- #define GPIO_CS_Pin_Type GPIOC3 k0 P( Y: w$ g& ]! Q
3 X* H7 v8 X6 Q( ^) B# t6 o: l% ?* g4 C- ) k L0 L) X2 b! w
- #define SPI_CS_ENABLE HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_RESET ). R5 `% r: n: f! Q$ h7 g
- #define SPI_CS_DISABLE HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_SET )$ Q$ B6 J4 e1 U. s3 c/ ?# Q
- 6 w, A* X S1 u, V" N3 S
-
r* X1 E8 o. l; r; e' r4 e - /* SPI command for TLE5012 */
3 X$ _8 }8 Q" C# P8 M - #define READ_STATUS 0x8001 //8000
2 z% [2 F; q0 A1 } [ - #define READ_ANGLE_VALUE 0x8021 //80209 Q; A8 q. q2 |0 w: g- _ ~3 M
- #define READ_SPEED_VALUE 0x8031 //8030) e9 B- [3 r/ S. g2 D" z
-
! P6 I% M; r* g9 ^+ a - #define WRITE_MOD1_VALUE 0x5060 //0_1010_0_000110_0001: K0 r; z5 k/ Z* C& E+ M3 V9 S
- #define MOD1_VALUE 0x0001
) W7 K! ?; K' E, m1 y/ V/ | - 5 y# Z* z- c+ K5 _
- #define WRITE_MOD2_VALUE 0x5080 //0_1010_0_001000_0001* L2 ] D5 z" a( K7 Q/ W( k+ u! b
- #define MOD2_VALUE 0x08014 f( ~( y' ^5 z; R5 Z) q' g
- 4 t' A1 m& N/ |6 B
- #define WRITE_MOD3_VALUE 0x5091 //0_1010_0_001001_0001
" t0 V" H% Q5 j( m* |1 P - #define MOD3_VALUE 0x0000
+ N% K; w7 ^3 q! o) I8 T3 S -
' q5 Y2 c% X" e9 g: @$ |3 ]4 f - #define WRITE_MOD4_VALUE 0x50E0 //0_1010_0_001110_0001( u$ x2 \6 }7 p- ~: @7 v
- #define MOD4_VALUE 0x0098 //9bit 512
& O P+ ?' P& C+ r" G: T -
! H U/ j. q9 q! L8 S+ K - #define WRITE_IFAB_VALUE 0x50B1, V9 K$ t4 Q% u3 I3 |
- #define IFAB_VALUE 0x000D5 g. s! }3 V: g+ Z
- /* Functionality mode */
3 n, x/ }7 d$ s( c5 A - #define REFERESH_ANGLE 0
! `) \& T, e5 B5 x9 {- g - * x) j9 P! o: q& I
- void SPI_SendData16(uint16_t SendData);
- s5 v! i& Y( o2 c0 g [, B" L - uint16_t SPI_ReadData16(void);
0 l: ]$ q% R. H/ ~ - double ReadAngle(void);
5 E$ y# ?" C1 [$ K9 S7 _" b - uint16_t ReadSpeed(void);
- D8 y+ ^2 S' A" P) J4 W1 E7 N - uint16_t ReadValue(uint16_t u16Value);
$ q) L! l# T3 |- f$ D% V. v - uint16_t SPIx_ReadWriteByte(uint16_t byte); L0 y& I2 v3 ~, P, n4 w
- uint16_t TlE5012W_Reg(uint16_t Reg_CMD, uint16_t Reg_Data);
* Y' M. m1 {6 }9 ]
- D n3 r3 c+ K2 O4 p( i
3 u/ q: D( y/ P- #endif
复制代码
5 N9 I1 s" h2 a8 j k5 M* u) T1 O读取角度打印在串口助手上
, p }3 W3 H) ]( p- v
. Y7 M! R r) J( w F# p/ Q5 _# W
( Z" u. @# [1 r
源工程:
tle5012b.rar
(3.55 MB, 下载次数: 297)
|