找回密码
 注册
关于网站域名变更的通知
查看: 734|回复: 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模块使。+ R. |# }1 ^6 b! _' X* |
1、宏定义I2C模块操作参数
( Y+ I0 N: r3 {+ i/ S#define I2C_SLAVE_ADDR        0x50    //器件地址不含读写位。以24Cxx系列为例,器件地址应为:(0xA0>>1),即0x50
4 Q+ b" U3 ~, O+ ^$ s#define I2C_NUMBYTES          10        //发送/接收数据长度
3 ~2 s+ R: [" ]9 X' [% l#define I2C_EEPROM_HIGH_ADDR  0x00
  N# m& {% a! [- `9 i# e4 v#define I2C_EEPROM_LOW_ADDR   0x00& F# J1 ]1 g  K- o- d

  e8 n/ C# u. @; m# |, K2、设置相应GPIO引脚用作I2C引脚。 修改F2802x_I2C.c文件中的void InitI2CGpio()函数。+ s" w( p# m) Q& J2 I
3、初始化I2C模块。
2 ~5 |! V: `2 r. P9 h' `void I2CA_Init(void)3 H( h+ I' P) o- j: ?
{. g) p8 C% E# t$ A8 w+ I' C
   // Initialize I2C
  [. z# {, X' }% d3 c- m   I2caRegs.I2CSAR = 0x0050;        // Slave address - EEPROM control code
6 H" C0 L' Y$ X3 y1 E/ }4 j+ I0 W  v' M/ g8 K. T- n, s- d
   // I2CCLK = SYSCLK/(I2CPSC+1)- y* p2 {' k4 [6 P" K  i. _0 w
   #if (CPU_FRQ_40MHZ||CPU_FRQ_50MHZ)
1 ~: J( S+ p" K3 Y  H$ A& L     I2caRegs.I2CPSC.all = 4;       // Prescaler - need 7-12 Mhz on module clk
+ ]* H' F# W' ^   #endif% j- ^" X% u" n6 t, ~; v0 J
; s6 X& R# Z4 E) P7 a& [- d2 D
   #if (CPU_FRQ_60MHZ)6 ^2 }" c  @2 Q% [: g
     I2caRegs.I2CPSC.all = 6;       // Prescaler - need 7-12 Mhz on module clk$ P; M/ E/ X1 L
   #endif
1 g, V: x) u; F  |) S3 z5 S   I2caRegs.I2CCLKL = 10;           // NOTE: must be non zero
; G" N" m' r- c! o6 D6 \! M   I2caRegs.I2CCLKH = 5;            // NOTE: must be non zero
% N. j0 g8 [1 N5 S   I2caRegs.I2CIER.all = 0x00;      // Enable SCD & ARDY interrupts# E! s. Z! V' w

" e, H7 z1 E% y; Z! V+ O! ?7 V   I2caRegs.I2CMDR.all = 0x0020;    // Take I2C out of reset$ G+ E: r* Q; w4 P6 a
                                    // Stop I2C when suspended0 N4 B# |0 {7 P7 x/ R* G+ e
1 B3 Q3 m& |9 j8 i
   I2caRegs.I2CFFTX.all = 0x0000;   // Enable FIFO mode and TXFIFO
% ^: x$ C: P0 T, c0 R; i+ n2 H0 w: E   I2caRegs.I2CFFRX.all = 0x0000;   // Enable RXFIFO, clear RXFFINT,
: {4 k( k( d, a$ X- g
6 ?1 |& ^3 Z0 S/ c$ i   return;& x+ [. G, b  e9 ?" E
}& x2 a) ]7 n% o
4、执行I2C模块接收或者发送。
( x# f( [5 B( w* K! A  v: p//I2C模块发送数据到I2C器件。7 ^. R6 ?- [3 Y
void  I2CA_SendData(void)7 c2 X1 o& @4 _; K4 I* U" g7 A' ^
{
2 h$ k9 Z9 u8 m$ l- v. L           Uint16 i;
/ W' e9 u+ n- h+ d; d  D( x+ X           I2caRegs.I2CSAR = I2C_SLAVE_ADDR;                         //Set slave address
- W5 y' q8 e( a$ U- O           I2caRegs.I2CCNT = I2C_NUMBYTES + 2;                         //Set count to 5 characters plus 2 address bytes7 F( j, {$ h4 x0 F
           I2caRegs.I2CDXR = I2C_EEPROM_HIGH_ADDR;                        //Send eeprom high address
+ a# X+ ?( F- ~) }& {% y           I2caRegs.I2CMDR.bit.TRX = 1;                                 //Set to Transmit mode
1 g  `! E* A5 g. C9 ?8 L           I2caRegs.I2CMDR.bit.MST = 1;                                 //Set to Master mode- @) ?7 y9 O$ N/ k# I; j$ J
           I2caRegs.I2CMDR.bit.FREE = 1;                                //Run in FREE mode6 h, {9 H4 M) X& L" B
           I2caRegs.I2CMDR.bit.STP = 1;                                 //Stop when internal counter becomes 0
4 T3 {* h7 `4 Q. H/ r           I2caRegs.I2CMDR.bit.STT = 1;                                 //Send the start bit, transmission will follow
$ [4 h$ t# ?) Q" B- a% C# l* W           while(I2caRegs.I2CSTR.bit.XRDY == 0){};                 //Do nothing till data is shifted out8 H0 f6 j9 E  v) G( G
           I2caRegs.I2CDXR = I2C_EEPROM_LOW_ADDR;                          //Send eeprom low address
* Q4 @' W: B  f3 O" E$ c
  j- \& R6 Y/ i' z+ c           for(i = 0; i < I2C_NUMBYTES; i++){
$ O* K( o- _7 P                   while(I2caRegs.I2CSTR.bit.XRDY == 0){};         //Do nothing till data is shifted out
' q; V9 X9 S5 B6 m+ H0 l3 p' c* \                   I2caRegs.I2CDXR = TxdData;                                         //Send out the message
  a! S# S: }+ {6 {           }
1 o) v7 S1 W0 q$ U3 K  e; m}
6 \1 w4 d4 G$ J& F0 p/ p//I2C模块从I2C器件接收数据。( D3 `3 o8 ~- X( O
void  I2CA_ReceiveData(void)
& O+ N* M% _- n  T# M* V+ w{
) b" G2 @3 p5 p& t4 D% _           Uint16 i;
# E4 F1 x; ~1 Z7 }% w4 W$ k           I2caRegs.I2CSAR = I2C_SLAVE_ADDR;                         //Set slave address
3 P6 P: w  e4 ~* d" N           I2caRegs.I2CCNT = 2;                                                 //Set count to 2 address bytes5 x1 d/ F% D8 ]! ^% {
           I2caRegs.I2CDXR = I2C_EEPROM_HIGH_ADDR;                        //Send eeprom high address% }6 {+ p; k0 Q1 p' u3 Y6 j
           I2caRegs.I2CMDR.bit.TRX = 1;                                 //Set to Transmit mode
" o2 _6 x9 Z/ g2 j7 v' B+ ]           I2caRegs.I2CMDR.bit.MST = 1;                                 //Set to Master mode7 D9 e3 N. o, R# G  j7 ~" ~
           I2caRegs.I2CMDR.bit.FREE = 1;                                //Run in FREE mode  P' a3 u0 K! C8 {
           I2caRegs.I2CMDR.bit.STP = 0;                                 //Dont release the bus after Tx( p+ Y- l2 B1 f$ }, y
           I2caRegs.I2CMDR.bit.STT = 1;                                 //Send the start bit, transmission will follow
* ^- w2 k; N+ O9 _
$ x( Y- P5 d* `           while(I2caRegs.I2CSTR.bit.XRDY == 0){};                 //Do nothing till data is shifted out4 C$ [& v/ T- I) z2 _8 X0 h
           I2caRegs.I2CDXR = I2C_EEPROM_LOW_ADDR;                         //Send eeprom low address
# F8 j! T! M, z2 M& p$ I) i9 S           I2caRegs.I2CCNT = I2C_NUMBYTES;                                //read 5 bytes from eeprom
9 q- N! G- v- W+ {& `) q           I2caRegs.I2CMDR.bit.TRX = 0;                                 //Set to Recieve mode
$ v/ o7 a7 m) ^* Y3 i$ u6 A/ L           I2caRegs.I2CMDR.bit.MST = 1;                                 //Set to Master mode
9 F8 r% _1 G  d; N6 }           I2caRegs.I2CMDR.bit.FREE = 1;                                //Run in FREE mode
: @) Z3 S& n. S: [; Y9 j           I2caRegs.I2CMDR.bit.STP = 1;                                 //Stop when internal counter becomes 0
) B& @. h, D  N. D9 j' B           I2caRegs.I2CMDR.bit.STT = 1; //Repeated start, Reception will follow
1 N  q6 ~7 K+ a2 d! M           for(i = 0; i < I2C_NUMBYTES; i++){
* E# T% h# F# d1 P9 v                   while(I2caRegs.I2CSTR.bit.RRDY == 0){};         //I2CDRR not ready to read?
0 ~! E1 C4 `' W% \1 v0 ]8 \                   RxdData = I2caRegs.I2CDRR;1 n- E0 a! F/ I5 m
           }# G1 ?. I" R$ c, @' l
}

该用户从未签到

2#
发表于 2016-6-29 10:11 | 只看该作者
学习中,谢谢分享5 ^& D$ y  |9 Y. ^" h0 R; }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-6 15:07 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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