您好!
我用HALCoGen帮助里的I2C通信例程测试I2C时,数组RX_PACK只能收到前8位数据,并且程序运行不到 i2cClearSCD(i2cREG1)这句?当我把数组TX_PACK的后8位字符去除,只留前8位的时候,可以运行到 i2cClearSCD(i2cREG1)这句,然后我加了个串口发送中断去发送RX_PACK所接收的数据,结果没有进入中断,数据就发送了。弄了很久没有弄清楚什么问题?想问下是什么原因?前一个程序是HALCoGen帮助里的程序,后一个是我加串口发送中断的程序
修改的程序:
/* Include Files */
#include "sys_common.h" #include "system.h"/** @file sys_main.c * @brief Application main file * @date 15.Aug.2012 * @version 03.02.00 * * This file contains an empty main function, * which can be used for the application. */
/* (c) Texas Instruments 2009-2012, All rights reserved. */
/* USER CODE BEGIN (0) */ /* USER CODE END */
/* Include Files */
#include "sys_common.h"
#include "system.h"
#include "i2c.h"
#include "sci.h"
#define own_add 0x20
#define slv_add 0x10
#define bsize 8
uint8_t TX_PACK[bsize]={'H','E','R','C','U','L','E','S'};
uint8_t RX_PACK[bsize]={0};
uint32_t data;
uint32_t Time;
static unsigned char a;
void i2cEnableLoopback(i2cBASE_t *i2c);
void sciNotification(sciBASE_t *sci, uint32_t flags);
void main(void)
{ uint32_t buf_size = bsize;
uint8_t *t_buff = &TX_PACK[0];
uint8_t *r_buff = &RX_PACK[0];
Time=8;
/* i2c initialization */
i2cInit();
sciInit();
_enable_IRQ();
/* set i2c own address */
i2cSetOwnAdd(i2cREG1,own_add);
/* enable internal loopback */
i2cEnableLoopback(i2cREG1);
/* Initiate Start condition for Transmission */
i2cSetStart(i2cREG1);
/* send data packets */
while(buf_size–)
{ i2cSendByte(i2cREG1,*t_buff++); /* receive data packets */
*r_buff++ = i2cReceiveByte(i2cREG1);
}
/* Clear Stop Condition detect flag */
i2cClearSCD(i2cREG1);
while(1)
{ if(Time==8)
{ Time=0;
sciSend(scilinREG,buf_size,RX_PACK);
}
}
}
void sciNotification(sciBASE_t *sci, uint32_t flags)
{
sciSend(scilinREG, bsize, RX_PACK);
Time++;
}
Jay:
你好,
你是不是设置了接收到8个字节就产生STOP了。
在I2C的Halcogen配置部分可以进行配置,请确认一下。
weibin chi:
回复 Jay:
Jay,你好
应该是我设置了接收到8个字节就产生STOP了。 我用的是TMS570LS3137的开发板,对于我修改的那个程序,没有进入中断就发送了,这个是什么原因?(已经设置了发送中断)
谢谢
Jay:
回复 weibin chi:
你有在主循环中一直在调用SCI的发送,所以数据就发出去了。
没有进中断,是因为你没有调用SCI的中断使能函数sciEnableNotification。
weibin chi:
回复 Jay:
Jay,你好
我看TMS570开发板中附带的关盘中的,有个SCI中断的收发视频,里面使能了接受中断,其程序里就没有调用中断使能函数sciEnableNotification,并且其主函数中调用了 sciReceive,而且我做了该例程,可以实现接受中断,如果把主函数中的 sciReceive去除,出现进入不了中断函数的情况。
·1、这是什么原因呀?
2、 想问什么时候要调用中断使能函数sciEnableNotification?
Jay:
回复 weibin chi:
我不清楚光盘中的视频是怎么做的。
但按我的经验,sciEnableNotification应该是要调用的。
你加sciEnableNotification调用先试试嘛。
weibin chi:
回复 Jay:
Jay,你好。
我有试过调用sciEnableNotification,但是问题还是没有解决,还是没有进入中断。你能不能给个你调试的,有用到串口中断的例程。
谢谢