查看: 4193|回复: 5

[分享] 【LPC800项目】代码分享:I2C驱动.

[复制链接]
  • TA的每日心情
    开心
    2023-6-2 13:32
  • 签到天数: 272 天

    连续签到: 1 天

    [LV.8]以坛为家I

    44

    主题

    995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4413
    最后登录
    2023-6-2
    发表于 2016-12-6 12:21:38 | 显示全部楼层 |阅读模式
    这个I2C程序是用于L3GD20的.
    在寄存器位置的第一个bit那里有特殊设置.
    而且寄存器长度也仅为1个byte.
    用于其他外围设备时,修改一下就OK了.
    总共三个函数.

    1. #include "./bsp/peripheral/i2c_hw.h"
    2. #include "./bsp/peripheral/gpio.h"

    3. #define SYSCON_SYSAHBCLKCTRL_I2C0       ((unsigned long)1<<5)
    4. #define SYSCON_SYSAHBCLKCTRL_SWM        ((unsigned long)1<<7)
    5. #define SYSCON_PRESETCTRL_I2C0_RST_N    ((unsigned long)1<<6)
    6. #define SWM_PINENABLE0_I2C0_SDA         ((unsigned long)1<<11)
    7. #define SWM_PINENABLE0_I2C0_SCL         ((unsigned long)1<<12)
    8. #define SYSCON_SYSAHBCLKCTRL_IOCON      ((unsigned long)1<<18)
    9. #define I2C_CFG_MSTEN                   ((unsigned long)1<<0)
    10. #define I2C_CFG_SLVEN                   ((unsigned long)1<<1)
    11. #define I2C_MSTCTL_MSTSTART             ((unsigned long)1<<1)
    12. #define I2C_MSTCTL_MSTCONTINUE          ((unsigned long)1<<0)
    13. #define I2C_MSTCTL_MSTSTOP              ((unsigned long)1<<2)
    14. #define I2C_STAT_MSTPENDING             ((unsigned long)1<<0)
    15. #define I2C_STAT_MSTSTATE_MASK          ((unsigned long)14)
    16. #define I2C_STAT_MSTSTATE_IDLE          ((unsigned long)0<<1)
    17. #define I2C_STAT_MSTSTATE_RX            ((unsigned long)1<<1)
    18. #define I2C_STAT_MSTSTATE_TX            ((unsigned long)2<<1)
    19. #define I2C_STAT_MSTSTATE_NACK_ADDRESS  ((unsigned long)3<<1)
    20. #define I2C_STAT_MSTSTATE_NACK_DATA     ((unsigned long)4<<1)

    21. void I2c_init(void){
    22.     LPC_SYSCON->SYSAHBCLKCTRL|=SYSCON_SYSAHBCLKCTRL_I2C0;
    23.    
    24.     LPC_SYSCON->PRESETCTRL&=~SYSCON_PRESETCTRL_I2C0_RST_N;
    25.     LPC_SYSCON->PRESETCTRL|=SYSCON_PRESETCTRL_I2C0_RST_N;
    26.    
    27.     LPC_SYSCON->SYSAHBCLKCTRL|=SYSCON_SYSAHBCLKCTRL_SWM;
    28.     LPC_SWM->PINENABLE0&=~(SWM_PINENABLE0_I2C0_SDA|SWM_PINENABLE0_I2C0_SCL);
    29.     LPC_SYSCON->SYSAHBCLKCTRL&=~SYSCON_SYSAHBCLKCTRL_SWM;
    30.    
    31.     LPC_I2C0->DIV=(0);/* 30M/8 = 3.75M /4 ~= 1M.*/
    32.    
    33.     LPC_SYSCON->SYSAHBCLKCTRL|=SYSCON_SYSAHBCLKCTRL_IOCON;
    34.     LPC_IOCON->PIO0_10|=0x02<<8;
    35.     LPC_IOCON->PIO0_11|=0x02<<8;
    36.     LPC_SYSCON->SYSAHBCLKCTRL&=~SYSCON_SYSAHBCLKCTRL_IOCON;
    37.    
    38.     LPC_I2C0->CFG|=I2C_CFG_MSTEN;
    39.     LPC_I2C0->MSTCTL=I2C_MSTCTL_MSTSTOP;
    40. }

    41. unsigned char I2c_set(
    42.     unsigned char slave,
    43.     unsigned short reg,
    44.     unsigned char *i_buf,
    45.     unsigned char size
    46. ){
    47.     unsigned char i;
    48.     while((LPC_I2C0->STAT&I2C_STAT_MSTPENDING)==0);
    49.     while((LPC_I2C0->STAT&I2C_STAT_MSTSTATE_MASK)!=I2C_STAT_MSTSTATE_IDLE);/*wait master to be idle.*/
    50.     LPC_I2C0->MSTDAT=(slave<<1);/*address with 0, write.*/
    51.     LPC_I2C0->MSTCTL=I2C_MSTCTL_MSTSTART;/*start the transaction.*/
    52.    
    53.     while((LPC_I2C0->STAT&I2C_STAT_MSTPENDING)==0);
    54.     while((LPC_I2C0->STAT&I2C_STAT_MSTSTATE_MASK)!=I2C_STAT_MSTSTATE_TX);/*wait the address to be ACK'd.*/
    55.     if(size!=1){
    56.         reg|=0x80;
    57.     }
    58.     LPC_I2C0->MSTDAT=(reg&0xFF);
    59.     LPC_I2C0->MSTCTL=I2C_MSTCTL_MSTCONTINUE;
    60.    
    61.     for(i=0;i<size;i++){
    62.         while((LPC_I2C0->STAT&I2C_STAT_MSTPENDING)==0);
    63.         while((LPC_I2C0->STAT&I2C_STAT_MSTSTATE_MASK)!=I2C_STAT_MSTSTATE_TX);
    64.         LPC_I2C0->MSTDAT=(*i_buf++);
    65.         LPC_I2C0->MSTCTL=I2C_MSTCTL_MSTCONTINUE;
    66.     }
    67.     while((LPC_I2C0->STAT&I2C_STAT_MSTPENDING)==0);
    68.     while((LPC_I2C0->STAT&I2C_STAT_MSTSTATE_MASK)!=I2C_STAT_MSTSTATE_TX);
    69.     LPC_I2C0->MSTCTL=I2C_MSTCTL_MSTSTOP;
    70.     return(0);
    71. }


    72. unsigned char I2c_get(
    73.     unsigned char slave,
    74.     unsigned short reg,
    75.     unsigned char *o_buf,
    76.     unsigned char size
    77. ){
    78.     unsigned char i;
    79.     while((LPC_I2C0->STAT&I2C_STAT_MSTPENDING)==0);
    80.     while((LPC_I2C0->STAT&I2C_STAT_MSTSTATE_MASK)!=I2C_STAT_MSTSTATE_IDLE);/*wait master to be idle.*/
    81.     LPC_I2C0->MSTDAT=(slave<<1);/*address with 0, write.*/
    82.     LPC_I2C0->MSTCTL=I2C_MSTCTL_MSTSTART;/*start the transaction.*/
    83.    
    84.     while((LPC_I2C0->STAT&I2C_STAT_MSTPENDING)==0);
    85.     while((LPC_I2C0->STAT&I2C_STAT_MSTSTATE_MASK)!=I2C_STAT_MSTSTATE_TX);/*wait the address to be ACK'd.*/
    86.     if(size!=1){
    87.         reg|=0x80;
    88.     }
    89.     LPC_I2C0->MSTDAT=(reg&0xFF);
    90.     LPC_I2C0->MSTCTL=I2C_MSTCTL_MSTCONTINUE;
    91.    
    92.     while((LPC_I2C0->STAT&I2C_STAT_MSTPENDING)==0);
    93.     while((LPC_I2C0->STAT&I2C_STAT_MSTSTATE_MASK)!=I2C_STAT_MSTSTATE_TX);/*wait the address to be ACK'd.*/
    94.     LPC_I2C0->MSTCTL=I2C_MSTCTL_MSTSTOP;
    95.    
    96.     while((LPC_I2C0->STAT&I2C_STAT_MSTPENDING)==0);
    97.     while((LPC_I2C0->STAT&I2C_STAT_MSTSTATE_MASK)!=I2C_STAT_MSTSTATE_IDLE);/*wait master to be idle.*/
    98.     LPC_I2C0->MSTDAT=((slave<<1)|(unsigned char)1);
    99.     LPC_I2C0->MSTCTL=I2C_MSTCTL_MSTSTART;

    100.     for(i=0;i<size;i++){
    101.         while((LPC_I2C0->STAT&I2C_STAT_MSTPENDING)==0);
    102.         while((LPC_I2C0->STAT&I2C_STAT_MSTSTATE_MASK)!=I2C_STAT_MSTSTATE_RX);/*wait the address to be ACK'd.*/
    103.         *o_buf++=LPC_I2C0->MSTDAT;
    104.         LPC_I2C0->MSTCTL=I2C_MSTCTL_MSTCONTINUE;
    105.     }
    106.     while((LPC_I2C0->STAT&I2C_STAT_MSTPENDING)==0);
    107.     while((LPC_I2C0->STAT&I2C_STAT_MSTSTATE_MASK)!=I2C_STAT_MSTSTATE_RX);
    108.     LPC_I2C0->MSTCTL=I2C_MSTCTL_MSTSTOP;

    109.     return(0);
    110. }

    复制代码
    有疑问或者改进欢迎跟贴~
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-6-11 09:06
  • 签到天数: 83 天

    连续签到: 1 天

    [LV.6]常住居民II

    7

    主题

    3446

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3044
    最后登录
    2025-7-15
    发表于 2016-12-6 15:25:21 | 显示全部楼层
    很好 学习了。。。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16702
    最后登录
    1970-1-1
    发表于 2016-12-6 21:22:32 | 显示全部楼层
    学习了
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2022-1-8 18:28
  • 签到天数: 93 天

    连续签到: 1 天

    [LV.6]常住居民II

    3

    主题

    221

    帖子

    0

    高级会员

    Rank: 4

    积分
    585
    最后登录
    2022-1-8
    发表于 2016-12-11 20:29:29 | 显示全部楼层
    还是只会点LED灯
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    40

    主题

    500

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1089
    最后登录
    2025-1-13
    发表于 2016-12-12 10:43:04 | 显示全部楼层
    看一哈不错!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-6-2 13:32
  • 签到天数: 272 天

    连续签到: 1 天

    [LV.8]以坛为家I

    44

    主题

    995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4413
    最后登录
    2023-6-2
     楼主| 发表于 2016-12-27 09:50:53 | 显示全部楼层

    会点灯已经很不错了~
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 22:19 , Processed in 0.090281 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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