找回密码
 注册
关于网站域名变更的通知
查看: 740|回复: 1
打印 上一主题 下一主题

I2C模块应用篇(查询法)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-6-28 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
F282xx/F283xx自身带有I2C模块,但受限于TI的官方例程中使用了fifo,其深度为4,在写EEPROM时,读写地址16位,占了2个字节,最多只留下2个字节存储数据,使用很不方便、实用性也极差。有不少网友在这一块碰壁,甚至逼的没办法使用IO口模拟I2C,放弃使用I2C模块。最近一直在测试28027的I2C模块有所获,可突破发送/接收长度限制(非fifo模式,当然这个长度也要和I2C器件匹)。本查介绍查询方式下的I2C模块使。! o/ Y* y, K7 F' `; ^
1、宏定义I2C模块操作参数; S9 d9 x5 Q& w: l
#define I2C_SLAVE_ADDR        0x50    //器件地址不含读写位。以24Cxx系列为例,器件地址应为:(0xA0>>1),即0x50
1 t; d) K  [7 p, r) C- p) a2 Y#define I2C_NUMBYTES          10        //发送/接收数据长度
) W' n1 q2 [% L! C0 y; M6 U#define I2C_EEPROM_HIGH_ADDR  0x00- l- z& ?4 y% i
#define I2C_EEPROM_LOW_ADDR   0x00
2 s/ z2 d! D- ]( p# y% _2 G2 ^( u! S
2、设置相应GPIO引脚用作I2C引脚。 修改F2802x_I2C.c文件中的void InitI2CGpio()函数。
/ x  [4 y, d- e* P3、初始化I2C模块。) |  k" }3 l& E6 B& P4 W
void I2CA_Init(void)
4 q# h" L, o/ ^# i! k{
% o) Y. W  q1 o, {6 _2 S& |/ I   // Initialize I2C( `' L; r1 o9 W# K5 C
   I2caRegs.I2CSAR = 0x0050;        // Slave address - EEPROM control code0 ^; N0 n( j9 k- T8 {2 w' P" d

# m3 U3 s& ~! D# f; R1 B* h4 F   // I2CCLK = SYSCLK/(I2CPSC+1)
8 E# e& o" |. N$ n, g- @4 h* D, Z   #if (CPU_FRQ_40MHZ||CPU_FRQ_50MHZ)
" F; l: n. V! v& F% ?; a     I2caRegs.I2CPSC.all = 4;       // Prescaler - need 7-12 Mhz on module clk& S3 w3 p7 t0 r# h0 T
   #endif
/ i9 H4 z5 j: K( G  w* Z) d9 }3 v6 H$ O: C! k/ m6 P
   #if (CPU_FRQ_60MHZ)
$ y) X& l9 T2 B  K+ m     I2caRegs.I2CPSC.all = 6;       // Prescaler - need 7-12 Mhz on module clk8 k7 _+ X/ B* I/ S4 u: s$ k
   #endif
: o: s8 l4 g8 R) b+ v   I2caRegs.I2CCLKL = 10;           // NOTE: must be non zero
( m' d; O( Z) `6 B7 r6 X- K   I2caRegs.I2CCLKH = 5;            // NOTE: must be non zero
( _: c1 h! c! S: L# W) c   I2caRegs.I2CIER.all = 0x00;      // Enable SCD & ARDY interrupts# _" ~/ a6 W- l, x# Z6 ~7 ^
- E$ ]8 H/ J+ ]0 f
   I2caRegs.I2CMDR.all = 0x0020;    // Take I2C out of reset- f+ ?: L: \$ P( s1 \  L4 K
                                    // Stop I2C when suspended
/ p8 z0 d6 y1 S7 Z, D5 G
2 n+ S6 Z' h9 q   I2caRegs.I2CFFTX.all = 0x0000;   // Enable FIFO mode and TXFIFO, D. R. b" E) y: J/ E% |8 K
   I2caRegs.I2CFFRX.all = 0x0000;   // Enable RXFIFO, clear RXFFINT,
. I$ _9 I- [9 C0 v" X) @
% A( t1 L9 b9 {, }; w6 J   return;5 {, Z0 U0 ^, A
}+ Y/ L& [. l. Z
4、执行I2C模块接收或者发送。
: @6 i/ {5 o# q( G' L% a1 T//I2C模块发送数据到I2C器件。( J2 }: I! A' x  V
void  I2CA_SendData(void)
7 G( c% a+ L  p$ G& ~{+ d- l" x1 L' k* E/ }% d6 A3 ]
           Uint16 i;) ?6 ^8 {4 j4 n9 B0 t
           I2caRegs.I2CSAR = I2C_SLAVE_ADDR;                         //Set slave address
0 Q8 i: l2 u& {5 I0 X' `           I2caRegs.I2CCNT = I2C_NUMBYTES + 2;                         //Set count to 5 characters plus 2 address bytes8 x7 u2 M( w6 }2 ~' x6 Z+ k
           I2caRegs.I2CDXR = I2C_EEPROM_HIGH_ADDR;                        //Send eeprom high address
' n9 V/ Q! p& k" Y, w           I2caRegs.I2CMDR.bit.TRX = 1;                                 //Set to Transmit mode
0 l) ?  d" [1 H' L5 M" A           I2caRegs.I2CMDR.bit.MST = 1;                                 //Set to Master mode/ D2 h0 V8 j% k- w3 S+ v
           I2caRegs.I2CMDR.bit.FREE = 1;                                //Run in FREE mode% {* a2 }: {, {# z/ {# S" S; ?6 \: T
           I2caRegs.I2CMDR.bit.STP = 1;                                 //Stop when internal counter becomes 0+ ^. r$ a8 ]( B1 e
           I2caRegs.I2CMDR.bit.STT = 1;                                 //Send the start bit, transmission will follow2 r. t, A) \9 k# ]+ d$ U+ a
           while(I2caRegs.I2CSTR.bit.XRDY == 0){};                 //Do nothing till data is shifted out* V. ^4 Y$ s' a. O% ~
           I2caRegs.I2CDXR = I2C_EEPROM_LOW_ADDR;                          //Send eeprom low address7 X' }, d' H! q+ t

) Z9 b: a1 f: U           for(i = 0; i < I2C_NUMBYTES; i++){2 R5 i! C% M+ V/ {% N
                   while(I2caRegs.I2CSTR.bit.XRDY == 0){};         //Do nothing till data is shifted out
  n# r7 t0 H5 X& B9 G! C) K; q( R                   I2caRegs.I2CDXR = TxdData;                                         //Send out the message
0 X1 H0 a& a/ \, ?           }
7 m1 L, b8 B7 o# G}
1 C! r: \! T/ d# d: x* H//I2C模块从I2C器件接收数据。9 O. I' F9 x* P, N6 n
void  I2CA_ReceiveData(void)! |, N, ?5 T3 v( j: X' v- S7 @
{
( w% }" r8 o4 i- i, f9 ~9 d& d           Uint16 i;  K( l8 A1 l  ^$ F. ~2 T2 g! G! B
           I2caRegs.I2CSAR = I2C_SLAVE_ADDR;                         //Set slave address
+ F) z1 v2 o. e1 S; @( F           I2caRegs.I2CCNT = 2;                                                 //Set count to 2 address bytes2 ?* T0 Z5 A6 d. D
           I2caRegs.I2CDXR = I2C_EEPROM_HIGH_ADDR;                        //Send eeprom high address) X, Z" d- j+ N1 l3 \7 X! x+ @; D
           I2caRegs.I2CMDR.bit.TRX = 1;                                 //Set to Transmit mode+ u6 h: m7 c3 B; \: |$ l
           I2caRegs.I2CMDR.bit.MST = 1;                                 //Set to Master mode  Q- q3 ~- ~- z4 [0 M" x8 i+ x
           I2caRegs.I2CMDR.bit.FREE = 1;                                //Run in FREE mode
. ]! D+ Y- @; n           I2caRegs.I2CMDR.bit.STP = 0;                                 //Dont release the bus after Tx
/ S: o3 s8 q/ T% T3 ~; c           I2caRegs.I2CMDR.bit.STT = 1;                                 //Send the start bit, transmission will follow+ b- y6 B9 m! H( o7 }; j
# O1 O  K+ Z4 k( M- |6 g
           while(I2caRegs.I2CSTR.bit.XRDY == 0){};                 //Do nothing till data is shifted out
. ^6 P8 n: j3 G5 y9 o/ X3 l! G           I2caRegs.I2CDXR = I2C_EEPROM_LOW_ADDR;                         //Send eeprom low address
' Q, t0 }( a9 z! H' F           I2caRegs.I2CCNT = I2C_NUMBYTES;                                //read 5 bytes from eeprom
( {0 m! z" X( x           I2caRegs.I2CMDR.bit.TRX = 0;                                 //Set to Recieve mode8 @$ u# Q* o) o
           I2caRegs.I2CMDR.bit.MST = 1;                                 //Set to Master mode
1 `- x  j$ ?: z  z- J" ?           I2caRegs.I2CMDR.bit.FREE = 1;                                //Run in FREE mode1 {% U2 E2 D( |' K5 V6 w7 v
           I2caRegs.I2CMDR.bit.STP = 1;                                 //Stop when internal counter becomes 0
$ \. ?2 P/ P' D! j$ R* i5 O' ]* g           I2caRegs.I2CMDR.bit.STT = 1; //Repeated start, Reception will follow
' f7 D+ h3 E/ R7 u: J% z           for(i = 0; i < I2C_NUMBYTES; i++){0 _4 l5 R' K  l8 q6 r
                   while(I2caRegs.I2CSTR.bit.RRDY == 0){};         //I2CDRR not ready to read?
5 x1 w! |% o+ K* v3 ~3 K                   RxdData = I2caRegs.I2CDRR;
4 u( W) ~' T# T' N& F0 C- W3 G; ^           }
- A* g- L' x0 x7 m& A, i- V}

该用户从未签到

2#
发表于 2016-6-29 10:11 | 只看该作者
学习中,谢谢分享
0 `9 g1 R6 h1 `3 {1 {8 z9 J3 L
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-4 13:51 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表