查看: 2908|回复: 7

[求助] 请问kinetis有用GPIO模拟I2C的参考代码吗?

[复制链接]

该用户从未签到

63

主题

263

帖子

0

高级会员

Rank: 4

积分
921
最后登录
2021-2-23
发表于 2017-6-30 14:27:52 | 显示全部楼层 |阅读模式
你好,请问kinetis有用GPIO模拟I2C的参考代码吗?因为目前项目要用到的I2C口比较多,需要用IO来模拟,但之前没有弄过,所以想求一下代码来参考,非常感谢!
我知道答案 目前已有7人回答
回复

使用道具 举报

  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9277
    最后登录
    2022-5-12
    发表于 2017-6-30 14:36:08 | 显示全部楼层
    模拟iic  和什么主控芯片 没关系,先去学习下iic 时序吧
    好好
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    连续签到: 1 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7879
    最后登录
    2025-4-11
    发表于 2017-6-30 14:58:27 | 显示全部楼层
    模拟的随便找个例程就行了,说白了就是GPIO操作和延时而已
    来根华子
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2017-6-30 15:01:10 | 显示全部楼层
    1. #include "ioiic.h"

    2. static 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. static 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 SDA0_OUT()
    17. {
    18.    gpio_pin_config_t sda_config = {kGPIO_DigitalOutput, 1};
    19.    
    20.    CLOCK_EnableClock (IIC0_SDA_CLOCK);
    21.   
    22.    PORT_SetPinMux (IIC0_SDA_PORT,IIC0_SDA_PIN,kPORT_MuxAsGpio);//I2C0_SDA
    23.    GPIO_PinInit(IIC0_SDA_GPIO,IIC0_SDA_PIN,&sda_config);
    24.   
    25. }

    26. static void SDA0_IN()
    27. {
    28.    gpio_pin_config_t sda_config = {kGPIO_DigitalInput, 1};
    29.    
    30.    CLOCK_EnableClock (IIC0_SDA_CLOCK);
    31.   
    32.    PORT_SetPinMux (IIC0_SDA_PORT,IIC0_SDA_PIN,kPORT_MuxAsGpio);//I2C0_SDA
    33.    GPIO_PinInit(IIC0_SDA_GPIO,IIC0_SDA_PIN,&sda_config);
    34. }

    35. #if 0
    36. static void SDA1_OUT()
    37. {
    38.    gpio_pin_config_t sda_config = {kGPIO_DigitalOutput, 1};
    39.    
    40.    CLOCK_EnableClock (IIC1_SDA_CLOCK);
    41.   
    42.    PORT_SetPinMux (IIC1_SDA_PORT,IIC1_SDA_PIN,kPORT_MuxAsGpio);//I2C0_SDA
    43.    GPIO_PinInit(IIC1_SDA_GPIO,IIC1_SDA_PIN,&sda_config);
    44.   
    45. }

    46. static void SDA1_IN()
    47. {
    48.    gpio_pin_config_t sda_config = {kGPIO_DigitalInput, 1};
    49.    
    50.    CLOCK_EnableClock (IIC1_SDA_CLOCK);
    51.   
    52.    PORT_SetPinMux (IIC1_SDA_PORT,IIC1_SDA_PIN,kPORT_MuxAsGpio);//I2C0_SDA
    53.    GPIO_PinInit(IIC1_SDA_GPIO,IIC1_SDA_PIN,&sda_config);
    54. }
    55. #endif

    56. void IIC0_Config(void)
    57. {
    58.    gpio_pin_config_t scl_config = {kGPIO_DigitalOutput, 1};
    59.    
    60.    CLOCK_EnableClock (IIC0_SCL_CLOCK);
    61.   
    62.    PORT_SetPinMux (IIC0_SCL_PORT,IIC0_SCL_PIN,kPORT_MuxAsGpio);//I2C0_SCL
    63.    GPIO_PinInit(IIC0_SCL_GPIO,IIC0_SCL_PIN,&scl_config);
    64. }

    65. #if 0
    66. void IIC1_Config(void)
    67. {
    68.    gpio_pin_config_t scl_config = {kGPIO_DigitalOutput, 1};
    69.    
    70.    CLOCK_EnableClock (IIC1_SCL_CLOCK);
    71.   
    72.    PORT_SetPinMux (IIC1_SCL_PORT,IIC1_SCL_PIN,kPORT_MuxAsGpio);//I2C1_SCL
    73.    GPIO_PinInit(IIC1_SCL_GPIO,IIC1_SCL_PIN,&scl_config);
    74. }
    75. #endif


    76. void IIC0_Start(void)
    77. {
    78.         SDA0_OUT();     //sda线输出
    79.         IIC0_SDA_H;//IIC_SDA=1;                    
    80.         IIC0_SCL_H;//IIC_SCL=1;
    81.         delay_us(4);
    82.         IIC0_SDA_L;//IIC_SDA=0;//START:when CLK is high,DATA change form high to low
    83.         delay_us(4);
    84.         IIC0_SCL_L;//IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
    85. }          
    86. //产生IIC停止信号
    87. void IIC0_Stop(void)
    88. {
    89.         SDA0_OUT();//sda线输出
    90.         IIC0_SCL_L;//IIC_SCL=0;
    91.         IIC0_SDA_L;//IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
    92.         delay_us(4);
    93.         IIC0_SCL_H;//IIC_SCL=1;
    94.         IIC0_SDA_H;//IIC_SDA=1;//发送I2C总线结束信号
    95.         delay_us(4);                                                                  
    96. }
    97. //等待应答信号到来
    98. //返回值:1,接收应答失败
    99. //        0,接收应答成功
    100. uint8_t IIC0_Wait_Ack(void)
    101. {
    102.         uint8_t ucErrTime=0;
    103.         SDA0_IN();      //SDA设置为输入  
    104.         IIC0_SDA_H;//IIC_SDA=1;
    105.     delay_us(1);          
    106.         IIC0_SCL_H;//IIC_SCL=1;
    107.     delay_us(1);         
    108.         while(IIC0_SDA)
    109.         {
    110.                 ucErrTime++;
    111.                 if(ucErrTime>250)
    112.                 {
    113.                         IIC0_Stop();
    114.                         return 1;
    115.                 }
    116.         }
    117.         IIC0_SCL_L;//IIC_SCL=0;//时钟输出0           
    118.         return 0;  
    119. }
    120. //产生ACK应答
    121. void IIC0_Ack(void)
    122. {
    123.         IIC0_SCL_L;//IIC_SCL=0;
    124.         SDA0_OUT();
    125.         IIC0_SDA_L;//IIC_SDA=0;
    126.         delay_us(2);
    127.         IIC0_SCL_H;//IIC_SCL=1;
    128.         delay_us(2);
    129.         IIC0_SCL_L;//IIC_SCL=0;
    130. }
    131. //不产生ACK应答                    
    132. void IIC0_NAck(void)
    133. {
    134.         IIC0_SCL_L;//IIC_SCL=0;
    135.         SDA0_OUT();
    136.         IIC0_SDA_H;//IIC_SDA=1;
    137.         delay_us(2);
    138.         IIC0_SCL_H;//IIC_SCL=1;
    139.         delay_us(2);
    140.         IIC0_SCL_L;//IIC_SCL=0;
    141. }                                                                              
    142. //IIC发送一个字节
    143. //返回从机有无应答
    144. //
    145. //0,无应答                          
    146. void IIC0_Send_Byte(uint8_t txd)
    147. {                        
    148.     uint8_t t;   
    149.     SDA0_OUT();             
    150.     IIC0_SCL_L;//IIC_SCL=0;//拉低时钟开始数据传输
    151.     for(t=0;t<8;t++)
    152.     {              
    153.         //IIC_SDA=(txd&0x80)>>7;
    154.                 if((txd&0x80)>>7)
    155.                         IIC0_SDA_H;//IIC_SDA=1;
    156.                 else
    157.                         IIC0_SDA_L;//IIC_SDA=0;
    158.                 txd<<=1;           
    159.                 delay_us(2);   //对TEA5767这三个延时都是必须的
    160.                 IIC0_SCL_H;//IIC_SCL=1;
    161.                 delay_us(2);
    162.                 IIC0_SCL_L;//IIC_SCL=0;       
    163.                 delay_us(2);
    164.     }         
    165. }             
    166. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
    167. uint8_t IIC0_Read_Byte(unsigned char ack)
    168. {
    169.     unsigned char i,receive=0;
    170.     SDA0_IN();//SDA设置为输入
    171.     for(i=0;i<8;i++ )
    172.     {
    173.         IIC0_SCL_L;//IIC_SCL=0;
    174.         delay_us(2);
    175.                     IIC0_SCL_H;//IIC_SCL=1;
    176.         receive<<=1;
    177.         if(IIC0_SDA)receive++;   
    178.                 delay_us(1);
    179.     }                                         
    180.     if (!ack)
    181.         IIC0_NAck();//发送nACK
    182.     else
    183.         IIC0_Ack(); //发送ACK   
    184.     return receive;
    185. }

    186. #if 0
    187. void IIC1_Start(void)
    188. {
    189.         SDA1_OUT();     //sda线输出
    190.         IIC1_SDA_H;//IIC_SDA=1;                    
    191.         IIC1_SCL_H;//IIC_SCL=1;
    192.         delay_us(4);
    193.         IIC1_SDA_L;//IIC_SDA=0;//START:when CLK is high,DATA change form high to low
    194.         delay_us(4);
    195.         IIC1_SCL_L;//IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
    196. }          
    197. //产生IIC停止信号
    198. void IIC1_Stop(void)
    199. {
    200.         SDA1_OUT();//sda线输出
    201.         IIC1_SCL_L;//IIC_SCL=0;
    202.         IIC1_SDA_L;//IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
    203.         delay_us(4);
    204.         IIC1_SCL_H;//IIC_SCL=1;
    205.         IIC1_SDA_H;//IIC_SDA=1;//发送I2C总线结束信号
    206.         delay_us(4);                                                                  
    207. }
    208. //等待应答信号到来
    209. //返回值:1,接收应答失败
    210. //        0,接收应答成功
    211. uint8_t IIC1_Wait_Ack(void)
    212. {
    213.         uint8_t ucErrTime=0;
    214.         SDA1_IN();      //SDA设置为输入  
    215.         IIC1_SDA_H;//IIC_SDA=1;
    216.     delay_us(1);          
    217.         IIC1_SCL_H;//IIC_SCL=1;
    218.     delay_us(1);         
    219.         while(IIC1_SDA)
    220.         {
    221.                 ucErrTime++;
    222.                 if(ucErrTime>250)
    223.                 {
    224.                         IIC1_Stop();
    225.                         return 1;
    226.                 }
    227.         }
    228.         IIC1_SCL_L;//IIC_SCL=0;//时钟输出0           
    229.         return 0;  
    230. }
    231. //产生ACK应答
    232. void IIC1_Ack(void)
    233. {
    234.         IIC1_SCL_L;//IIC_SCL=0;
    235.         SDA1_OUT();
    236.         IIC1_SDA_L;//IIC_SDA=0;
    237.         delay_us(2);
    238.         IIC1_SCL_H;//IIC_SCL=1;
    239.         delay_us(2);
    240.         IIC1_SCL_L;//IIC_SCL=0;
    241. }
    242. //不产生ACK应答                    
    243. void IIC1_NAck(void)
    244. {
    245.         IIC1_SCL_L;//IIC_SCL=0;
    246.         SDA1_OUT();
    247.         IIC1_SDA_H;//IIC_SDA=1;
    248.         delay_us(2);
    249.         IIC1_SCL_H;//IIC_SCL=1;
    250.         delay_us(2);
    251.         IIC1_SCL_L;//IIC_SCL=0;
    252. }                                                                              
    253. //IIC发送一个字节
    254. //返回从机有无应答
    255. //
    256. //0,无应答                          
    257. void IIC1_Send_Byte(uint8_t txd)
    258. {                        
    259.     uint8_t t;   
    260.     SDA1_OUT();             
    261.     IIC1_SCL_L;//IIC_SCL=0;//拉低时钟开始数据传输
    262.     for(t=0;t<8;t++)
    263.     {              
    264.         //IIC_SDA=(txd&0x80)>>7;
    265.                 if((txd&0x80)>>7)
    266.                         IIC1_SDA_H;//IIC_SDA=1;
    267.                 else
    268.                         IIC1_SDA_L;//IIC_SDA=0;
    269.                 txd<<=1;           
    270.                 delay_us(2);   //对TEA5767这三个延时都是必须的
    271.                 IIC1_SCL_H;//IIC_SCL=1;
    272.                 delay_us(2);
    273.                 IIC1_SCL_L;//IIC_SCL=0;       
    274.                 delay_us(2);
    275.     }         
    276. }             
    277. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
    278. uint8_t IIC1_Read_Byte(unsigned char ack)
    279. {
    280.     unsigned char i,receive=0;
    281.     SDA1_IN();//SDA设置为输入
    282.     for(i=0;i<8;i++ )
    283.     {
    284.         IIC1_SCL_L;//IIC_SCL=0;
    285.         delay_us(2);
    286.                     IIC1_SCL_H;//IIC_SCL=1;
    287.         receive<<=1;
    288.         if(IIC1_SDA)receive++;   
    289.                 delay_us(1);
    290.     }                                         
    291.     if (!ack)
    292.         IIC1_NAck();//发送nACK
    293.     else
    294.         IIC1_Ack(); //发送ACK   
    295.     return receive;
    296. }
    297. #endif
    复制代码
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-6-18 08:45
  • 签到天数: 812 天

    连续签到: 1 天

    [LV.10]以坛为家III

    66

    主题

    4899

    帖子

    64

    金牌会员

    Rank: 6Rank: 6

    积分
    6321
    最后登录
    2025-7-15
    发表于 2017-6-30 15:37:28 | 显示全部楼层
    开心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    连续签到: 1 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7879
    最后登录
    2025-4-11
    发表于 2017-6-30 15:57:30 | 显示全部楼层
    来根华子
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-7-3 22:59
  • 签到天数: 39 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    67

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    221
    最后登录
    2018-7-3
    发表于 2017-6-30 19:46:18 | 显示全部楼层
    学习了
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-7-4 09:29
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    1

    主题

    48

    帖子

    10

    中级会员

    Rank: 3Rank: 3

    积分
    257
    最后登录
    2019-12-23
    发表于 2017-7-21 14:11:10 | 显示全部楼层
    那个,弱弱的问一下,板子上的I2C不够用吗?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-20 05:05 , Processed in 0.100962 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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