查看: 1663|回复: 1

[分享] LPC812基于LPC_open的IO模拟IIC程序验证通过

[复制链接]
  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-9-2 16:29:44 | 显示全部楼层 |阅读模式
    本帖最后由 技术范儿 于 2016-9-2 16:32 编辑

    最近用LPC812做了一个提东东,由于时间要求比较紧张直接用的官方的LPC_open,有点类似于FSL的SDK 1.x的版本,但是提供的例程还是比较丰富的,最恶心的是LPC812的IO可以随意映射其他功能(电源不算),比FSL的还灵活,废话不多说了,模拟IIC的代码呈上孝敬各位坛友了,在FSL的基础上改的,函数不多,但是Keil给整的乱码了。。。。。。最后对两位积热心助我的FAE表示感谢!
    1. #include "iic.h"


    2. void delay_us(uint16_t xus)
    3. {
    4.     uint16_t i,j;
    5.     for(i=xus;i>0;i--)
    6.        for(j=16;j>0;j--)
    7.           __asm("NOP");
    8. }

    9. void delay_ms(uint16_t xms)
    10. {
    11.     uint16_t i,j;
    12.     for(i=xms;i>0;i--)
    13.         for(j=19999;j>0;j--)
    14.             __asm("NOP");
    15. }

    16. static void SDA_OUT()
    17. {
    18.    Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT,0,11);//SDA->11
    19. }

    20. static void SDA_IN()
    21. {
    22.    Chip_GPIO_SetPinDIRInput(LPC_GPIO_PORT,0,11);//SDA->11
    23. }
    24.   
    25. static void SCL_Config()
    26. {
    27.    Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT,0,10);//SCL->10
    28. }


    29. uint8_t ReadSDA(void)
    30. {
    31.     if(Chip_GPIO_ReadPortBit(LPC_GPIO_PORT,0,11) == true)
    32.         return 1;
    33.     if(Chip_GPIO_ReadPortBit(LPC_GPIO_PORT,0,11) == false)
    34.         return 0;
    35.    
    36. }


    37. void IIC_Start(void)
    38. {
    39.         SDA_OUT();     //sda???
    40.         IIC_SDA_H;//IIC_SDA=1;                    
    41.         IIC_SCL_H;//IIC_SCL=1;
    42.         delay_us(4);
    43.          IIC_SDA_L;//IIC_SDA=0;//START:when CLK is high,DATA change form high to low
    44.         delay_us(4);
    45.         IIC_SCL_L;//IIC_SCL=0;//??I2C??,?????????
    46. }         
    47. //??IIC????
    48. void IIC_Stop(void)
    49. {
    50.         SDA_OUT();//sda???
    51.         IIC_SCL_L;//IIC_SCL=0;
    52.         IIC_SDA_L;//IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
    53.          delay_us(4);
    54.         IIC_SCL_H;//IIC_SCL=1;
    55.         IIC_SDA_H;//IIC_SDA=1;//??I2C??????
    56.         delay_us(4);                                                                  
    57. }
    58. //????????
    59. //???:1,??????
    60. //        0,??????
    61. uint8_t IIC_Wait_Ack(void)
    62. {
    63.         uint8_t ucErrTime=0;
    64.         SDA_IN();      //SDA?????  
    65.         IIC_SDA_H;//IIC_SDA=1;
    66.     delay_us(1);           
    67.         IIC_SCL_H;//IIC_SCL=1;
    68.   delay_us(1);         
    69.         while(IIC_SDA)
    70.         {
    71.                 ucErrTime++;
    72.                 if(ucErrTime>250)
    73.                 {
    74.                         IIC_Stop();
    75.                         return 1;
    76.                 }
    77.         }
    78.         IIC_SCL_L;//IIC_SCL=0;//????0            
    79.         return 0;  
    80. }
    81. //??ACK??
    82. void IIC_Ack(void)
    83. {
    84.         IIC_SCL_L;//IIC_SCL=0;
    85.         SDA_OUT();
    86.         IIC_SDA_L;//IIC_SDA=0;
    87.         delay_us(2);
    88.         IIC_SCL_H;//IIC_SCL=1;
    89.         delay_us(2);
    90.         IIC_SCL_L;//IIC_SCL=0;
    91. }
    92. //???ACK??                    
    93. void IIC_NAck(void)
    94. {
    95.         IIC_SCL_L;//IIC_SCL=0;
    96.         SDA_OUT();
    97.         IIC_SDA_H;//IIC_SDA=1;
    98.         delay_us(2);
    99.         IIC_SCL_H;//IIC_SCL=1;
    100.         delay_us(2);
    101.         IIC_SCL_L;//IIC_SCL=0;
    102. }                                                                              
    103. //IIC??????
    104. //????????
    105. //1,???
    106. //0,???                          
    107. void IIC_Send_Byte(uint8_t txd)
    108. {                        
    109.    uint8_t t;   
    110.         SDA_OUT();            
    111.     IIC_SCL_L;//IIC_SCL=0;//??????????
    112.     for(t=0;t<8;t++)
    113.     {              
    114.         //IIC_SDA=(txd&0x80)>>7;
    115.                 if((txd&0x80)>>7)
    116.                         IIC_SDA_H;//IIC_SDA=1;
    117.                 else
    118.                         IIC_SDA_L;//IIC_SDA=0;
    119.                 txd<<=1;           
    120.                 delay_us(2);   //?TEA5767??????????
    121.                 IIC_SCL_H;//IIC_SCL=1;
    122.                 delay_us(2);
    123.                 IIC_SCL_L;//IIC_SCL=0;        
    124.                 delay_us(2);
    125.     }         
    126. }            
    127. //?1???,ack=1?,??ACK,ack=0,??nACK   
    128. uint8_t IIC_Read_Byte(unsigned char ack)
    129. {
    130.         unsigned char i,receive=0;
    131.         SDA_IN();//SDA?????
    132.     for(i=0;i<8;i++ )
    133.         {
    134.         IIC_SCL_L;//IIC_SCL=0;
    135.         delay_us(2);
    136.                 IIC_SCL_H;//IIC_SCL=1;
    137.         receive<<=1;
    138.         if(IIC_SDA)receive++;   
    139.                 delay_us(1);
    140.     }                                         
    141.     if (!ack)
    142.         IIC_NAck();//??nACK
    143.     else
    144.         IIC_Ack(); //??ACK   
    145.     return receive;
    146. }

    147. void IIC_Config()
    148. {
    149.     SDA_OUT();
    150.     SCL_Config();
    151. }

    复制代码
    1. #ifndef __IIC_H
    2. #define __IIC_H


    3. #include "hardware.h"

    4. #define IIC_SDA_H    Chip_GPIO_SetPinOutHigh (LPC_GPIO_PORT,0,11)
    5. #define IIC_SDA_L    Chip_GPIO_SetPinOutLow  (LPC_GPIO_PORT,0,11)
    6. #define IIC_SCL_H    Chip_GPIO_SetPinOutHigh (LPC_GPIO_PORT,0,10)
    7. #define IIC_SCL_L    Chip_GPIO_SetPinOutLow  (LPC_GPIO_PORT,0,10)
    8. #define IIC_SDA      ReadSDA()

    9. void delay_us(uint16_t xus);
    10. void delay_ms(uint16_t xms);
    11. void IIC_Config(void);
    12. void IIC_Start(void);
    13. void IIC_Stop(void);
    14. uint8_t IIC_Wait_Ack(void);
    15. void IIC_Ack(void);
    16. void IIC_NAck(void);
    17. void IIC_Send_Byte(uint8_t txd);
    18. uint8_t IIC_Read_Byte(unsigned char ack);


    19. #endif
    复制代码


    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-12-11 06:45
  • 签到天数: 37 天

    [LV.5]常住居民I

    0

    主题

    167

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    342
    最后登录
    2023-7-19
    发表于 2016-10-20 17:01:05 | 显示全部楼层
    呵呵
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-4 09:39 , Processed in 0.120464 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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