Post Go back to editing

ADuC7061怎么与Cortex-M3之间用IIC通讯?

各位大虾好,

     我想实现Cortex-M3与ADuC7061之间用IIC通讯,Cortex-M3用做主机,ADuC7061用做从机 。我要实现收发数据,ADuC7061应该怎样配置呢,思路是什么?

  • 您好,您只要按照标准的I2C配置流程,将ADUCM360配置成主机模式,ADUC7061配置成从机模式,与操作其他I2C设备没有什么区别。附件里面是一个ADUC7061做从机,ADUCM360做主机的示例。

    梦归魂 wrote:

    各位大虾好,

         我想实现Cortex-M3与ADuC7061之间用IIC通讯,Cortex-M3用做主机,ADuC7061用做从机 。我要实现收发数据,ADuC7061应该怎样配置呢,思路是什么?

    attachments.zip
  • 你好,我发现你给的ADuC7061做为I2C从机的配置有问题。

    我目前是打算用ADuC7061来做I2C从机,然后用TI的LM3S9B92做I2C主机(Cortex-m3内核),现在的问题是当发送从机地址和写位后ADuC7061有应答,LM3S9B92能将数据传给ADuC7061;但是当发送从机地址和读位时ADuC7061却没有应答,IIC通讯失败,我不知这是什么导致的。下面是我的ADuC7061部分的配置(注:LM3S9B92寻址其他从机和读操作时,其他从机是有应答的,这样就排除了LM3S9B92的I2C读操作的程序问题)

    ADuC7061做为I2C从机的配置:

    /************************************************************************************************

    Author        : YangJie

    Date          : 2013.5.31

    File          : I2C_Slave.c

    Hardware      : ADuC7061

    Description   :  此测试程序以9B92为主机接收,电源与继电器板的ADuC7061为从机发送
    *************************************************************************************************/
    // Bit Definitions
    #define BIT0  0x01
    #define BIT1  0x02
    #define BIT2  0x04
    #define BIT3  0x08
    #define BIT4  0x10
    #define BIT5  0x20
    #define BIT6  0x40
    #define BIT7  0x80
    #define BIT8  0x100
    #define BIT9  0x200
    #define BIT10 0x400
    #define BIT11 0x800
    #define BIT12 0x1000
    #define BIT13 0x2000
    #define BIT14 0x4000
    #define BIT15 0x8000
    #define BIT16 0x10000

    #include <aduc7060.h>
    #include "stdio.h"
    #include "string.h"

    unsigned char szStoreData[] = {0x48, 0x52, 0x53, 0x54, 0x55, 0x56}; // Array to send to Slave
    unsigned char ucStoreCount = 0;  // Array index variable for szStoreData[]


    //******************************************************************************************
    //
    // 主函数
    //
    //******************************************************************************************
    int main(void)

         POWKEY1 = 0x1;
         POWCON0 = 0x78;     // Set core to max CPU speed of 10.24Mhz
         POWKEY2 = 0xF4;


         //
         // Configure P0.1 and P0.3 for I2C mode
         //
         GP0CON0 = BIT4 + BIT12; // Select SPI/I2C alternative function for P0.1 & P0.3
         GP0KEY1 = 0x7;     // Write to GP0KEY1
         GP0CON1 = BIT1;     // Select I2C functionality for P0.1 & P0.3
         GP0KEY2 = 0x13;     // Write to GP0KEY2

        

         // Enable I2C Slave mode, Slave ID and interrupt sources
         I2CID0  = 0xAA;   // Configure Slave's I2C network address

         I2CFSTA |= BIT8;   // Flush Slave Tx FIFO
         I2CFSTA &= ~BIT8;
         I2CSCON |= BIT0 + BIT5 + BIT8 + BIT9 + BIT10 ;

         IRQEN = BIT16;    // Enable I2C Slave interrupts

         ucStoreCount = 0;

         while (1)
         {

         }

    }

    void IRQ_Handler(void) __irq 
    {

          unsigned long IRQSTATUS = 0;
          unsigned int I2CSSTATUS = 0;

          IRQSTATUS = IRQSTA;    // Read off IRQSTA register


          if ((IRQSTATUS & BIT16) == BIT16) //If I2C Slave interrupt source
          {
               I2CSSTATUS = I2CSSTA;
      
               if ((I2CSSTATUS & BIT2) == BIT2) // If I2C Master Tx IRQ
               {
                    if (ucStoreCount < 6)     // Have max 6 bytes been sent?
                    I2CSTX = szStoreData[ucStoreCount++];  // Load Tx buffer
               }
               if ((I2CSSTATUS & BIT3) == BIT3) // If I2C Master Rx IRQ
               {
                    if (ucStoreCount < 6)     // Have max 6 bytes been received?
                    {
                         szStoreData[ucStoreCount] = I2CSRX;  // Read Rx buffer
                         ucStoreCount++;
                     }
                }
               if ((I2CSSTATUS & BIT10) == BIT10) // If I2C Stop after Start condition detected IRQ
               {
                    ucStoreCount = 0; // Reset counter Array pointer.
                    I2CFSTA = BIT8;   // Flush Slave Tx FIFO
                    I2CFSTA &= ~BIT8;

               }
               if ((I2CSSTATUS & BIT13) == BIT13) // If I2C Repeated Start detected IRQ
               {
                    ucStoreCount = 0; // Reset counter Array pointer.
                    I2CFSTA = BIT8;   // Flush Slave Tx FIFO
                    I2CFSTA &= ~BIT8;
               }
          }
    }

  • 您需要清掉general call 的标志位。 I2CSCON = BIT0 + BIT4   // Enable I2C Slave + Enable Rx interrupt +

                                                        + BIT9 + BIT10  // Enable Rx interrupt + Enable Tx interrupt +