微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI WIFI设计交流 > CC3200 I2C Slave模式无法进入中断

CC3200 I2C Slave模式无法进入中断

时间:10-02 整理:3721RD 点击:

Hi,大家好

  我在调试CC3200的I2C Slave,使用的是lauchpad GCC + Eclipse开发,之前测试了一下CC3200 I2Cmaster模式,工作正常, 现在改为Slave模式发现无法进入中断,通过逻辑分析仪分析,我发现CC3200有被寻址到,也回复了应答信号,但是这些东西并不是我的中断程序做的。

下面是我的代码:

void main(void)

{

...

// Configure PIN_05 for I2C0 I2C_SCL
PinTypeI2C(PIN_05, PIN_MODE_5);

// Configure PIN_06 for I2C0 I2C_SDA
PinTypeI2C(PIN_06, PIN_MODE_5);

MAP_PRCMPeripheralClkEnable(PRCM_I2CA0, PRCM_RUN_MODE_CLK);

MAP_PRCMPeripheralReset(PRCM_I2CA0);

I2CSlaveInit(I2CA0_BASE, 127);

I2CSlaveFIFODisable(I2CA0_BASE);

MAP_I2CIntRegister(PRCM_I2CA0, I2C0_IRQHandler);

I2CSlaveIntEnableEx(I2CA0_BASE,
I2C_SLAVE_INT_START |
I2C_SLAVE_INT_STOP |
I2C_SLAVE_INT_DATA);

while(1) {  }

}

void I2C0_IRQHandler(void)
{
unsigned char rx_data;

GPIOPinWrite(GPIOA3_BASE, 0x01, 1);
MAP_UtilsDelay(1);
GPIOPinWrite(GPIOA3_BASE, 0x01, 0);

Message("I2C0 Inte! \r\n");

if(I2C0_SCSR & I2C_SCSR_DA) //Check RREQ = 1?
{
/* I2C Master Write */

//Receive data from data register
rx_data = I2C0_SDR;

//Send ACK signal
I2CSlaveACKValueSet(I2CA0_BASE, 1);
}
else if(I2C0_SCSR & I2C_SCSR_TREQ) //Check RREQ = 1?
{
I2C0_SDR = 0x37;
}
else
{
return;
}

}

谢谢.

你好,我最近也在做i2c slave 中断,但是对初始化不大清晰,想问下Eugene这方面调通了吗?帮忙指点下,拜托

调通了,如果有需要可以给我发邮件 yuting0501@gmail.com

如果可以,能否把你的工程附件在这里,本着分享的精神, :-)

配置没有问题,是之前的SDK没有支持GCC,中断向量表没有重映射,导致无法进入中断。

您好!

我也遇到一样的问题。代码和您给出的差不多,I2C Slave地址0x24,用 PIN01 和 PIN02,LaunchPad 的 J2 J3 已经取下。

CC2541作为 I2C Master,用 123k 或 256k 时钟都试过(CC2541 I2C 不支持100k或400k时钟,不知道问题是否出在这里)。CC2541 的 I2C 处理程序已经在其它地方验证过,没有问题。

现象:

1. CC3200 作为 I2C Slave 没有进入中断处理;

2. CC2541 作为 I2C Master 没有收到 Addr ACK,无法发送数据。

3. 使用 IAR,Debug 发现 Memory I2CA0 在初始化过程中没有任何变化,不解。

您能否将调试通过的代码发给我:378648860@qq.com,非常感谢!

补充一下我的测试代码:

void main()
{
  long lRetVal = -1;

  // Initialize Board configurations
  BoardInit();

  // Pinmux for UART
  PinMuxConfig();

  // Configuring UART
  InitTerm();

  // Initialize I2C as salve
  i2cs_Init();
 
  UART_PRINT("\r\n**I2C intialized as slave, ready to receive data...\r\n");
 
  while(1)
  {    
  }    
}

void i2cs_Init(void)
{
  //Enable I2C Peripheral
  MAP_PRCMPeripheralClkEnable(PRCM_I2CA0, PRCM_RUN_MODE_CLK);
  MAP_PRCMPeripheralReset(PRCM_I2CA0);

  //Init Slave Mode, Set Slave Address
  I2CSlaveInit(I2CA0_BASE, I2C_SLAVE_ADDR);

  I2CSlaveFIFODisable(I2CA0_BASE);

  //Enable Slave Interrupt
  I2CSlaveIntEnableEx(I2CA0_BASE, I2C_SLAVE_INT_START|I2C_SLAVE_INT_STOP|I2C_SLAVE_INT_DATA);

  //Register I2C Interrupt
  I2CIntRegister(I2CA0_BASE, i2cs_IrqIntHandler);
  
  I2CSlaveDataGet(I2CA0_BASE);

  //Enable Processor
  IntEnable(INT_I2CA0);
}

void i2cs_IrqIntHandler(void)
{
  uint32_t uiStatus;
  uint32_t data;
  //char str[10];
 
  UART_PRINT("I2C IRQ: "); 
   
  uiStatus = I2CSlaveStatus(I2CA0_BASE);
  I2CSlaveIntClearEx(I2CA0_BASE, I2C_SLAVE_INT_DATA);
 
  if(uiStatus & I2C_SCSR_DA)
  {
    data = I2CSlaveDataGet(I2CA0_BASE);
   
    //memcpy(str, &data, 4);
    UART_PRINT("0x%X ", data);
  }
  else if(uiStatus & I2C_SLAVE_ACT_TREQ)
  {
    I2CSlaveDataPut(I2CA0_BASE, 0x01);
  } 
}

void PinMuxConfig(void)
{
  // Enable Peripheral Clocks
  MAP_PRCMPeripheralClkEnable(PRCM_UARTA0, PRCM_RUN_MODE_CLK);
  MAP_PRCMPeripheralClkEnable(PRCM_GPIOA1, PRCM_RUN_MODE_CLK);

  // Configure PIN_55 for UART0 UART0_TX
  MAP_PinTypeUART(PIN_55, PIN_MODE_3);

  // Configure PIN_57 for UART0 UART0_RX
  MAP_PinTypeUART(PIN_57, PIN_MODE_3);

  // Configure PIN_03 for I2C0 I2C_SCL
  MAP_PinTypeI2C(PIN_01, PIN_MODE_0);

  // Configure PIN_04 for I2C0 I2C_SDA
  MAP_PinTypeI2C(PIN_02, PIN_MODE_0); 
}

Hi calvin,

和I2C相关的代码我已经都发到我的问题中。CC3200的中断向量表是需要重映射的,你是否定义了IAR编译器的宏?你可以试着打印一下中断向量表,观察一下I2C中断的函数地址,是否和其他默认的中断函数地址相同,如果相同则说明你未重映射中断向量表。

谢谢您的飞速回复!您说的中断向量表设置是不是这一段,工程定义了 ewarm 编译选项,并且执行了 MAP_IntVTableBaseSet

void BoardInit(void)
{
/* In case of TI-RTOS vector table is initialize by OS itself */
#ifndef USE_TIRTOS
  // Set vector table base
  #if defined(ccs)
  MAP_IntVTableBaseSet((unsigned long)&g_pfnVectors[0]);
  #endif
  #if defined(ewarm)
  MAP_IntVTableBaseSet((unsigned long)&__vector_table);
  #endif
#endif
  // Enable Processor
  MAP_IntMasterEnable();
  MAP_IntEnable(FAULT_SYSTICK);

  PRCMCC3200MCUInit();
}

我明白您说的意思了,IAR 的中断向量表定义在 startup_ewarm.c 中,其中 I2C0 的入口还是 IntDefaultHandler,所以工作不正常。

我马上改了试试

我遇到的问题和您遇到的不一样,我的 vector table 是正确初始化了的,在 IntRegister() 也正确地将中断处理函数写到了 vector table。

我的程序已经调通,问题有两个:

1. PIN_01 和 PIN_02 配置错了,应该是 PIN_MODE_1,我写成  PIN_MODE_0 了。该问题导致引脚配置成通用 GPIO;

2. 开发板的 J2 和 J3 不应该取下,取下后导致 SCL 和 SDA 没有上拉,数据传输不稳定,很容易断开。

希望对后面的童鞋们有帮助。

您好,请问CC3200能触发起始信号和停止信号的中断,但是收不到数据中断,请问这有可能是什么原因导致的呢?

您好,请问CC3200能触发起始信号和停止信号的中断,但是收不到数据中断,请问这有可能是什么原因导致的呢?

上一篇:CC3200 spi demo
下一篇:cc3200flash问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top