找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

电巢直播8月计划
查看: 153|回复: 1
打印 上一主题 下一主题

I2C模块应用篇(查询法)

[复制链接]

154

主题

485

帖子

1156

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1156
跳转到指定楼层
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( v* c) T7 i6 N) l
1、宏定义I2C模块操作参数
( e+ Z/ [( C1 n#define I2C_SLAVE_ADDR        0x50    //器件地址不含读写位。以24Cxx系列为例,器件地址应为:(0xA0>>1),即0x50
( s1 x8 j: {8 Y#define I2C_NUMBYTES          10        //发送/接收数据长度
4 z. ~' Q9 k( c5 C+ c) X" I+ J" [#define I2C_EEPROM_HIGH_ADDR  0x00
8 l1 ~- x1 I, B; h* t' o" U#define I2C_EEPROM_LOW_ADDR   0x00
6 ~2 O) N& D" c; K8 ~" q
( a3 F/ a) {( d' M2、设置相应GPIO引脚用作I2C引脚。 修改F2802x_I2C.c文件中的void InitI2CGpio()函数。& y$ z* S9 c5 Y5 X
3、初始化I2C模块。# k$ @7 ?1 w/ n$ e
void I2CA_Init(void)
$ M0 X6 D% a! s6 X) B{
3 P) d& _+ D$ V$ h2 x( q) e   // Initialize I2C
" s7 [$ A' K1 Q0 n; ~  |( z0 I   I2caRegs.I2CSAR = 0x0050;        // Slave address - EEPROM control code# \9 [0 @- t: H9 {( o) ]; \

* j( ^2 o  x9 j5 O! j' c, N   // I2CCLK = SYSCLK/(I2CPSC+1)
( P7 G1 ?, D6 n/ I& G% R   #if (CPU_FRQ_40MHZ||CPU_FRQ_50MHZ)
: G' x, L1 S- y     I2caRegs.I2CPSC.all = 4;       // Prescaler - need 7-12 Mhz on module clk+ p* F* x6 D1 E5 O, I; k
   #endif
4 S: J, h. L# {  K0 p8 K* y6 H8 d* z( B9 j5 Y$ u  K$ }! R* D, s, L
   #if (CPU_FRQ_60MHZ)# ?( \- `6 r4 }5 I% H6 C
     I2caRegs.I2CPSC.all = 6;       // Prescaler - need 7-12 Mhz on module clk
4 k) b( ]; f6 M- J8 Y+ d& h  V" Q   #endif
4 m8 ]+ M6 q' }2 }' {& N$ _* ]: t   I2caRegs.I2CCLKL = 10;           // NOTE: must be non zero+ [$ }6 q' x4 Q) `0 @
   I2caRegs.I2CCLKH = 5;            // NOTE: must be non zero7 @5 }; V& V; N3 X9 K+ f
   I2caRegs.I2CIER.all = 0x00;      // Enable SCD & ARDY interrupts
/ K- F8 m& [0 J. Y8 o
: v) D4 @; O0 M% d; ~   I2caRegs.I2CMDR.all = 0x0020;    // Take I2C out of reset: }6 ]. P6 O. L' H( H4 z! [
                                    // Stop I2C when suspended. ]& K# ?: p% M/ c& z- w
+ s' c: F7 k2 t/ t# E; [
   I2caRegs.I2CFFTX.all = 0x0000;   // Enable FIFO mode and TXFIFO6 o" c1 W6 I1 [9 O( g: W
   I2caRegs.I2CFFRX.all = 0x0000;   // Enable RXFIFO, clear RXFFINT,5 ]0 [5 z. l) ^

3 C5 G& M' Y, a7 h# H$ i7 i   return;" ]& B! Q9 M! F, p* q
}" B# }0 Z5 b: |0 S
4、执行I2C模块接收或者发送。# |6 s: g9 E8 _: K+ B
//I2C模块发送数据到I2C器件。
9 e+ @* h" s! F$ Q; }+ kvoid  I2CA_SendData(void). f" W' z4 i% B: Q
{$ b, |$ i2 O3 `4 q; k7 V  p
           Uint16 i;) A9 |. ]* K* M
           I2caRegs.I2CSAR = I2C_SLAVE_ADDR;                         //Set slave address1 P  B* m& F7 \) @7 {. {
           I2caRegs.I2CCNT = I2C_NUMBYTES + 2;                         //Set count to 5 characters plus 2 address bytes
" O9 `) i& f: T/ X           I2caRegs.I2CDXR = I2C_EEPROM_HIGH_ADDR;                        //Send eeprom high address- v+ d4 k  |; ?( S8 ~
           I2caRegs.I2CMDR.bit.TRX = 1;                                 //Set to Transmit mode
' ^* ^! G+ D4 e! u           I2caRegs.I2CMDR.bit.MST = 1;                                 //Set to Master mode: O0 h1 t9 l! x6 x" J! y
           I2caRegs.I2CMDR.bit.FREE = 1;                                //Run in FREE mode
1 U+ ^* Q. J3 Y/ C           I2caRegs.I2CMDR.bit.STP = 1;                                 //Stop when internal counter becomes 0
8 ^( {  R! X3 z5 l: I2 w           I2caRegs.I2CMDR.bit.STT = 1;                                 //Send the start bit, transmission will follow
; `" a4 k% x: g           while(I2caRegs.I2CSTR.bit.XRDY == 0){};                 //Do nothing till data is shifted out
+ v* ?; Q- U# ^4 i. U2 a2 U           I2caRegs.I2CDXR = I2C_EEPROM_LOW_ADDR;                          //Send eeprom low address
  T  T, V  t& M5 o! I0 b5 I# z
  D2 D% W' K# |, e/ U           for(i = 0; i < I2C_NUMBYTES; i++){: v6 A- d  |$ W6 [
                   while(I2caRegs.I2CSTR.bit.XRDY == 0){};         //Do nothing till data is shifted out$ l! B8 R8 l7 @- Z4 A" H; F
                   I2caRegs.I2CDXR = TxdData;                                         //Send out the message
1 T0 X4 ^) ^$ @/ c9 |6 S           }: w+ ?+ N$ x! y
}
1 f, k* R3 V4 D- f% F//I2C模块从I2C器件接收数据。2 p5 [, L- F( P  z2 ~, ^9 h
void  I2CA_ReceiveData(void)
1 K$ Q) G- M: C7 k{
8 {4 W3 L2 e! H0 d; S; T5 A- Q- g           Uint16 i;
+ `* L3 y7 Y) v8 L           I2caRegs.I2CSAR = I2C_SLAVE_ADDR;                         //Set slave address
0 J  M2 q! X( Y) _           I2caRegs.I2CCNT = 2;                                                 //Set count to 2 address bytes
+ D' R, E" l- y6 {& s           I2caRegs.I2CDXR = I2C_EEPROM_HIGH_ADDR;                        //Send eeprom high address  _- w$ ~+ |$ e% R6 G8 C5 r
           I2caRegs.I2CMDR.bit.TRX = 1;                                 //Set to Transmit mode" h0 ~* N) b  }: [
           I2caRegs.I2CMDR.bit.MST = 1;                                 //Set to Master mode9 U6 v! v' H$ A/ b* O
           I2caRegs.I2CMDR.bit.FREE = 1;                                //Run in FREE mode" a) n: j" }$ m9 T
           I2caRegs.I2CMDR.bit.STP = 0;                                 //Dont release the bus after Tx
  E) F/ X% r5 v' @0 J7 a           I2caRegs.I2CMDR.bit.STT = 1;                                 //Send the start bit, transmission will follow
3 I" ^! ]6 r% l+ d; g/ I# Z! b) k6 J
           while(I2caRegs.I2CSTR.bit.XRDY == 0){};                 //Do nothing till data is shifted out
; J# T. u: M8 y6 p5 x           I2caRegs.I2CDXR = I2C_EEPROM_LOW_ADDR;                         //Send eeprom low address
7 ^* v7 e. a' y% x7 t8 d           I2caRegs.I2CCNT = I2C_NUMBYTES;                                //read 5 bytes from eeprom
, l/ \9 K- Y# Z           I2caRegs.I2CMDR.bit.TRX = 0;                                 //Set to Recieve mode
/ Y( v" ~5 m7 M, @           I2caRegs.I2CMDR.bit.MST = 1;                                 //Set to Master mode8 m, @( Y1 c! P/ C
           I2caRegs.I2CMDR.bit.FREE = 1;                                //Run in FREE mode
: j; ~% r% R6 |3 L6 T  O           I2caRegs.I2CMDR.bit.STP = 1;                                 //Stop when internal counter becomes 0
- W" C: ?& P& v" W           I2caRegs.I2CMDR.bit.STT = 1; //Repeated start, Reception will follow1 E8 s) V  \" J4 Y; A
           for(i = 0; i < I2C_NUMBYTES; i++){' j4 K8 V, J+ p0 p$ s: R8 R
                   while(I2caRegs.I2CSTR.bit.RRDY == 0){};         //I2CDRR not ready to read?' K0 `) J/ `7 u  z  f! T8 S
                   RxdData = I2caRegs.I2CDRR;' Q8 U) T: e& b, g
           }
. t" b; F4 K; S- u1 X( g2 k3 [1 A}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

171

主题

616

帖子

1306

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1306
2#
发表于 2016-6-29 10:11 | 只看该作者
学习中,谢谢分享
# L6 C. a  f' S, M
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-7-1 04:36 , Processed in 0.057840 second(s), 29 queries , Gzip On.

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

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

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