M3s811的I2C主机与从机通信不成功,恳请专家指点

Other Parts Discussed in Thread: LM3S811

主机发送程序:

我用了两块LM3s811,一块做主机发送,另一块设置为从机接收。但是各程序运行,却不产生中断,也不知能不能发送数据。接收数据也不成功。中断向量表也注册了。这是怎么回事啊?(下面是我设置的代码)

主机发送程序:

void I2CMasterINTHandler()

{

   //I2CMasterIntClear(I2C_MASTER_BASE);

   //I2CIntUnregister(I2C_MASTER_BASE);

     while(I2CMasterBusBusy(I2C_MASTER_BASE)==0)

   {

    L12864_mesg(0,5,"产生中断");

   // L12864_shu(4,2,ComparatorValueGet(COMP_BASE,0));

   }

   //I2CIntRegister(I2C_MASTER_BASE,*I2CMasterINTHandler);      //注册一个中断    

}

//主函数

int main()

{

   jitagWait();                      //防止JTAG失效,重要

   clockInit();                      //时钟初始化 ;晶振:6MHz

   Ini_Lcd();

   L12864_mesg(0,0,"内部时钟");

   L12864_shu(4,0,TheSysClock);

   //

   // Enable the peripherals used by this example.

   //

   SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);

   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

   //

   //初始化主机和从机

   //

   I2CMasterInitExpClk(I2C_MASTER_BASE,SysCtlClockGet(),true);

   //I2CMasterInit(I2C_MASTER_BASE,false);

   //

   //自主编辑

   //

   I2CMasterEnable(I2C_MASTER_BASE);     //使能主机

   I2CMasterIntEnable(I2C_MASTER_BASE);  //使能中断

   //

   //指定从机地址

   //

    I2CMasterSlaveAddrSet(I2C_MASTER_BASE,0x3B,false);

   I2CIntRegister(I2C_MASTER_BASE,*I2CMasterINTHandler);      //注册一个中断

    //

    //将发送的字符放到数据寄存器中

    //

    I2CMasterDataPut(I2C_MASTER_BASE,'W');

    //

    //启动字符从主机发送到从机

    //

    I2CMasterControl(I2C_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_START);

     //

    //大循环

    //

    while(1)

    {

          L12864_mesg(0,3,"进入循环");

     while(I2CMasterBusBusy(I2C_MASTER_BASE)==0)

   {

     L12864_mesg(0,2,"发送成功");

     I2CMasterDataPut(I2C_MASTER_BASE,'W');

   // L12864_shu(4,2,ComparatorValueGet(COMP_BASE,0));

   }

    }

}

从机接收程序代码:

void I2CMasterINTHandler()

{

   I2CSlaveIntClear(I2C_SLAVE_BASE);

   while(I2CSlaveIntStatus(I2C_SLAVE_BASE,false))

       {

         L12864_mesg(5,2,"产生中断");

         L12864_shu(5,3, I2CSlaveDataGet(I2C_SLAVE_BASE));                    

       }

}

//主函数

int main()

{

   jitagWait();                      //防止JTAG失效,重要

   clockInit();                      //时钟初始化 ;晶振:6MHz

   Ini_Lcd();

   L12864_mesg(0,0,"内部时钟");

  L12864_shu(4,0,TheSysClock);

   //

   // Enable the peripherals used by this example.

   //

   SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);

   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

   //

   //初始化主机和从机

   //

   I2CMasterInitExpClk(I2C_SLAVE_BASE,SysCtlClockGet(),true);//这一句不明白是不是该设置

   //I2CMasterInit(I2C_MASTER_BASE,false);

   I2CSlaveInit(I2C_SLAVE_BASE,0x3B);      //初始化从机地址

   //

   //自主编辑

   //

   I2CIntRegister(I2C_SLAVE_BASE,*I2CMasterINTHandler);      //注册一个中断

   I2CSlaveEnable(I2C_SLAVE_BASE);     //使能从机

   I2CSlaveIntEnable(I2C_SLAVE_BASE);  //使能中断

    while(1)

    {

           while(I2CMasterBusy(I2C_SLAVE_BASE)==0)

       {

         L12864_mesg(0,2,"接收成功");

         L12864_shu(0,3, I2CSlaveDataGet(I2C_SLAVE_BASE));

       }

    }

}

上面我是写了两个程序,然后是分别烧写入两块板子的,最后连接其I2C口来进行通信。可是没有发送和接收数据!恳请专家指点!!(诚挚感谢)

  •   I2CMasterInitExpClk(I2C_SLAVE_BASE,SysCtlClockGet(),true);//这一句不明白是不是该设置

    从机不需要设置。

    建议你用示波器抓个图,来分析一下时序

  • 首先确认两条数据线都有上拉电阻, 建议用逻辑分析仪抓下。这样可以确认I2C模块有无工作。 如果I2C没工作,可能就是配置的地方有遗漏,可参考TI的例程。

  • 初略的看了你的代码有些疑问:

    1.你用查询的方式发送,为什么还要使能中断?注册中断函数?

    2.在中断函数中你没有清除中断状态,那怎么能产生下一次的中断?

    3.发送完成了为什么没有清除I2C的原始中断标志位?

    4.没有看到你发送ack位或者stop位?

    5.从机接收的时候也没有看到你配置为接收状态

    你可以再看看datasheet中有关I2C的内容,里面有I2C发送和接收的流程图,可以先对照着改一下代码。