您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 求助!BF518的使用TWI与ds1339c实时时钟芯片... 
本帖共有333个阅读者
发表帖子 发表投票 回复主题
求助!BF518的使用TWI与ds1339c实时时钟芯片连接,使用的是audio_mic的例程,可以写进去数据,但读数据的时候出现问题
feelingliang(论坛新手)
feelingliang
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:275
积分:27
注册时间:2017/9/14
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
求助!BF518的使用TWI与ds1339c实时时钟芯片连接,使用的是audio_mic的例程,可以写进去数据,但读数据的时候出现问题
在读ds1339c中的数据之前,先向ds1339c中写入一个初始时间,调用TWI_MasterMode_Write读函数,这个从示波器上看是没有问题的。但是TWI_MasterMode_Read操作时出现问题:

1.当参数unsigned short Count的值大于2的时候(Count为要读的数据字节的个数,采用八位二进制表示的),没有数据读出,
2.当红色字体的语句注释掉之后,且unsigned short Count的值不大于2时,有数据读出,但是红色字体的语句为判断FIFO缓存器中是否有数据,正常的操作过程就是先判断FIFO中有数据,然后才能读出数据,但在这里却要去掉才行。
3.当这个TWI_MasterMode_Read函数放在循环中时,第九次循环才有数据读出,之前都是0.

void TWI_MasterMode_Read(unsigned short DeviceAddr, unsigned char *TWI_Data_Pointer, unsigned short Count)
{
int i, j;
    *pTWI_FIFO_CTL = 0; /* clear the bit manually */
*pTWI_CONTROL = TWI_ENA | PRESCALE_VALUE; /* PRESCALE = fsclk/10MHz */
*pTWI_CLKDIV = ((CLKDIV_HI) << 8) | (CLKDIV_LO); /* CLKDIV = (1/SCL)/(1/10MHz) */
*pTWI_MASTER_ADDR = DeviceAddr; /* target address (7-bits plus the read/write bit) */
*pTWI_MASTER_CTL = (Count<<6) | MEN | MDIR /*| FAST*/; /* start transmission */

/* for each item */
for (i = 0; i < Count; i++)
{
while (*pTWI_FIFO_STAT == RCV_EMPTY) /* wait for data to be in FIFO */
ssync();
    
*TWI_Data_Pointer++ = *pTWI_RCV_DATA8; /* read the data */
ssync();

}

while ((*pTWI_INT_STAT & MCOMP) == 0) /* wait until transmission complete and MCOMP is set  */
ssync();

*pTWI_INT_STAT = RCVSERV | MCOMP; /* service TWI for next transmission */
// asm("nop;");
// asm("nop;");
// asm("nop;");
}

夜空中最亮的星
等级:论坛新手 参考IP地址:*.*.*.*
2017/12/7 9:00:42
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
在这个地方加个延时应该就好了。

for (i = 0; i < Count; i++)
{
while (*pTWI_FIFO_STAT == RCV_EMPTY) /* wait for data to be in FIFO */
ssync();

*TWI_Data_Pointer++ = *pTWI_RCV_DATA8; /* read the data */
ssync();
delay(10);
}



void delay(int count)
{
int i;
for(i=0;i<count;i++)
{
asm("nop;");
}
}

个人觉得TWI接口不是很好用,不如IO模拟。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2017/12/8 8:46:48
feelingliang(论坛新手)
feelingliang
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:275
积分:27
注册时间:2017/9/14
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
1. 这个是TWI的初始化程序,正常调用完这个写函数TWI_MasterMode_Write之后,就进入红色字体所示的if语句中,但是里边的for函数要等待的时间太长了,好像有3s的时间,但是注释掉之后,写函数TWI_MasterMode_Write虽然正常调用了,但是没有写进去。主要是等待的时间太长了,我改小等待时间也不行,这个应该怎么改呢?
void iic_init(void)
{
int j;

   int TWI_Error = 0;
TWISuccess = 0;

while (TWISuccess == 0 && TWI_Error < 100)
{
TWISuccess = 1;
Reset_TWI(); /* reset the TWI interface */

TWI_MasterMode_Write( AIC23B_ADDRESS>>1, AudioConfig, 11, 2);
if(TWISuccess)
for (j=0; j<0x1ffffff; j++) asm("nop;");
/*** lastly activate the digital engine *******************/

if(!TWISuccess)
TWI_Error++;
}
}

夜空中最亮的星
等级:论坛新手 参考IP地址:*.*.*.*
2017/12/8 22:08:14
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
这个是容错的一个判断,个人觉得TWI接口不是太好用,不如io模拟。这段代码来源于官方,从代码看,就是iic如果没响应,就反复初始化,直到超时。
你可以把延时改短一点看看

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2017/12/12 13:28:40
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159397 Call, 1 Queries, Processed in 0.015625 second(s),