查看: 3137|回复: 5

[求助] 求助,飞思卡尔KL25 IIC通信,从机中断函数编程

[复制链接]

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
9
最后登录
2015-3-14
发表于 2015-3-2 22:10:01 | 显示全部楼层 |阅读模式
KL25  IIC通信例程只有,主机给从机发送一个字节,从机接收这个字节的例程。我想在这个基础上,编写一个主机向从机读取一个字节。主机函数原本就有,从机中断函数不知道如何修改。求大神解答。我自己编了一个。好像不对。求指导。

void I2C0_isr(void)
{
        uint_8 i;
        uint_8 data;
        enter_critical(); // 进入临界区
        if(i2cwait('T'))            //等待一个数据传送完成
        {
            i=I2C0_D;               //读出IIC1D,准备接收数据
            goto lab;
        }
        //if((I2C0_S & 0x40)!=0)      //主机发送的地址与本机的默认地址匹配
        if((I2C0_S & I2C_S_IAAS_MASK)!=0)      //主机发送的地址与本机的默认地址匹配
        {
            i=I2C0_S & I2C_S_SRW_MASK;

            if(i==0)
            {
               if(0!=j)
               {
                   j=0;
                 goto lab;
               }
               BCLR(I2C_C1_TX_SHIFT,I2C0_C1);         //TX = 0,MCU设置为接收模式
            }
            else
            {//这边是我修改的主要地方
               BSET(I2C_C1_TX_SHIFT,I2C0_C1);         //TX = 1,MCU设置为发送模式
               I2C0_D =buf[visitaddr];    //将数据写进寄存器,准备发送数据
               j=0;
               goto lab;
            }
            
             i=I2C0_D;                //读出IIC1D,准备接收数据      
             j++;
         }
        else                         //接收到的为数据
        {
            if(1==j)                 //接收到主机发送过来的访问地址
           {
               visitaddr=I2C0_D;    //读出IIC1D,准备接收数据
      
               j++;goto lab;
            }
            if(2==j)                 //接收到主机发送过来的数据
            {
               data=I2C0_D;         //读出IIC1D,准备接收数据
               j++;
             }
             //如果从机地址匹配、访问地址与数据均接收到则将接收到的数据存入buf数组
             if(3==j)               
            {
               buf[visitaddr]=data;
               flag=1;              //置位该标志表明成功接收到主机发送过来的数据
             }
            j=0;
         }
         lab:    exit_critical();  // 离开临界区
}

我知道答案 目前已有5人回答
回复

使用道具 举报

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
9
最后登录
2015-3-14
 楼主| 发表于 2015-3-14 16:51:09 | 显示全部楼层
有结果了,首先发现教课书主机程序源代码上有个错误,即重新匹配地址后,主机改为接收模式,应为:BCLR(I2C_C1_TX_SHIFT,I2C_C1_REG(num));           //TX = 0,MCU设置为接收模式
而源程序为,BCLR(I2C_C1_RSTA_SHIFT,I2C_C1_REG(num));显然不对。
然后是从机中断的代码:
//============================================================================
//函数名称:I2C0_isr                                                        
//功能概要: I2C0中断服务程序,其负责接收主机发送过来的数据并置位flag标志,通知main中主循环打印该数据                                            
//参数说明:           
//       x:x = 'T'(Transmission),等待一个字节        数据传输完成                  
//函数返回: 无                                                                                                                           
//============================================================================
void I2C0_isr(void)
{
        uint_8 i;
        uint_8 data;
        enter_critical(); // 进入临界区
        if(i2cwait('T'))            //等待一个数据传送完成
        {
            i=I2C0_D;               //读出IIC1D,准备接收数据
            goto lab;
        }
        //if((I2C0_S & 0x40)!=0)      //主机发送的地址与本机的默认地址匹配
        if((I2C0_S & I2C_S_IAAS_MASK)!=0)      //主机发送的地址与本机的默认地址匹配
        {       
            i=I2C0_S & I2C_S_SRW_MASK;

            if(i==0)
            {
               if(0!=j)
               {
                   j=0;
                 goto lab;
               }       
               BCLR(I2C_C1_TX_SHIFT,I2C0_C1);         //TX = 0,MCU设置为接收模式
            }
            else//地址第0位位1,从机发送数据。
            {
               if(2==j)//如果是第二次匹配地址
               {                    
                 //i=I2C0_D;
                 BSET(I2C_C1_TX_SHIFT,I2C0_C1);         //TX = 1,MCU设置为发送模式
                 I2C0_D =buf[visitaddr];    //将数据写进寄存器,准备发送数据
                 if(i2cwait('T'))            //等待一个数据传送完成
                 {
                    i=I2C0_D;               //读出IIC1D,准备接收数据
                    goto lab;
                 }
                 BCLR(I2C_C1_TX_SHIFT,I2C0_C1);         //TX = 0,MCU设置为接收模式
                 i=I2C0_D;                  //读出IIC1D,准备接收数据
               }
               j=0;
               goto lab;
            }
            
             i=I2C0_D;                //读出IIC1D,准备接收数据      
             j++;
         }
        else                         //接收到的为数据
        {
            if(1==j)                 //接收到主机发送过来的访问地址
           {
               visitaddr=I2C0_D;    //读出IIC1D,准备接收数据
      
               j++;goto lab;
            }
            if(2==j)                 //接收到主机发送过来的数据
            {
               data=I2C0_D;         //读出IIC1D,准备接收数据
               j++;
             }
             //如果从机地址匹配、访问地址与数据均接收到则将接收到的数据存入buf数组
             if(3==j)               
            {
               buf[visitaddr]=data;
               flag=1;              //置位该标志表明成功接收到主机发送过来的数据
             }
            j=0;
         }
         lab:    exit_critical();  // 离开临界区
}

回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

22

帖子

0

注册会员

Rank: 2

积分
78
最后登录
2015-10-21
发表于 2015-5-8 23:15:03 | 显示全部楼层
顶起来我也正需要这个呢
回复 支持 反对

使用道具 举报

该用户从未签到

24

主题

364

帖子

0

高级会员

Rank: 4

积分
760
最后登录
2021-4-2
发表于 2015-6-6 10:49:45 | 显示全部楼层
书上的代码确实要仔细点
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

205

帖子

0

高级会员

Rank: 4

积分
516
最后登录
2016-2-16
发表于 2015-6-7 22:20:45 | 显示全部楼层
太高端了
回复

使用道具 举报

该用户从未签到

0

主题

119

帖子

0

中级会员

Rank: 3Rank: 3

积分
317
最后登录
2016-11-11
发表于 2015-6-8 12:07:49 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-27 12:27 , Processed in 0.094570 second(s), 26 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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