各位大虾好,
我想实现Cortex-M3与ADuC7061之间用IIC通讯,Cortex-M3用做主机,ADuC7061用做从机 。我要实现收发数据,ADuC7061应该怎样配置呢,思路是什么?
各位大虾好,
我想实现Cortex-M3与ADuC7061之间用IIC通讯,Cortex-M3用做主机,ADuC7061用做从机 。我要实现收发数据,ADuC7061应该怎样配置呢,思路是什么?
您好,您只要按照标准的I2C配置流程,将ADUCM360配置成主机模式,ADUC7061配置成从机模式,与操作其他I2C设备没有什么区别。附件里面是一个ADUC7061做从机,ADUCM360做主机的示例。
梦归魂 wrote:
各位大虾好,
我想实现Cortex-M3与ADuC7061之间用IIC通讯,Cortex-M3用做主机,ADuC7061用做从机 。我要实现收发数据,ADuC7061应该怎样配置呢,思路是什么?
你好,我发现你给的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 +