您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [求助]BF518外置实时时钟DS1399C(通过i2c连... 
本帖共有1587个阅读者
发表帖子 发表投票 回复主题
[求助]BF518外置实时时钟DS1399C(通过i2c连接),如何编写实时时钟的程序!!!!!!!!
feelingliang(论坛新手)
feelingliang
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:275
积分:27
注册时间:2017/9/14
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[求助]BF518外置实时时钟DS1399C(通过i2c连接),如何编写实时时钟的程序!!!!!!!!
BF518外置实时时钟DS1399C(通过i2c连接),如何编写实时时钟的程序,求各位大神指导,谢谢!!!!!!
上传的图片
  201791416374299.jpg [ 89.13 KB 570×612 ] (缩略时请点击查看原图)

 


上传的图片
  201791416375499.jpg [ 89.85 KB 529×552 ] (缩略时请点击查看原图)

 




夜空中最亮的星
等级:论坛新手 参考IP地址:*.*.*.*
2017/9/14 16:38:38
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
先在vdsp软件下,把官方提供的twi代码扒出来,写几个芯片的寄存器,看能否写入,然后根据芯片的读取时序用这个代码送值配置

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2017/9/15 9:10:47
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
如果能找到官方提供的驱动代码最好,把那个代码直接移植过来就可以了


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2017/9/15 9:12:37
feelingliang(论坛新手)
feelingliang
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:275
积分:27
注册时间:2017/9/14
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
#include <cdefBF518.h>
#include <ccblkfn.h>
#include "audio_regdef.h"

#define AIC23B_ADDRESS 0x34  

#define PRESCALE_VALUE 8
#define RESET_TWI 0 /* RESET_TWI value for controller */
#define CLKDIV_HI 66 /* SCL high period */
#define CLKDIV_LO 67 /* SCL low period */

int TWISuccess;

unsigned char AudioConfig[] = {
PWDC, 0x00FF,  
LLVC, 0x1d,
RLVC, 0x1d,
LHVC, 0x78,
RHVC, 0x78,
AAPC, 0xf5,
DAPC, 0,
PWDC, 1,
DAIF, MS|FOR|LRP,
SARC, 0,
DIAC, ACT|RES
};
unsigned char AudioColse[]={
RSRE, 0
};

void delay(int tem)
{
int j,i;
for(i=tem;i>0;i--)
{
for(j=1000;j>0;j--)
{
j=j;
}
}
}

/*******************************************************************
*   Function:    Reset_TWI
*   Description: reset the TWI interface
*******************************************************************/
void Reset_TWI(void)
{
     /* reset TWI controller */
*pTWI_CONTROL = RESET_TWI;   //#define RESET_TWI 0 /* RESET_TWI value for controller */
ssync();

/* clear errors before enabling TWI */
*pTWI_MASTER_STAT = BUFWRERR | BUFRDERR | LOSTARB | ANAK | DNAK;
ssync();

/* clear interrupts before enabling TWI */
*pTWI_INT_STAT = SINIT | SCOMP | SERR | SOVF | MCOMP | MERR | XMTSERV | RCVSERV;
ssync();

/* flush rx and tx fifos */
*pTWI_FIFO_CTL = XMTFLUSH | RCVFLUSH;
ssync();
/* set this to 1 so that we go into the write sequence the very first time */
TWISuccess = 1;
}
/*******************************************************************
*   Function:    ClrSclSda
*   Description: restores control of the TWI interface
*******************************************************************/
bool ClrSclSda(void)
{

int cnt = 0;

    do {

     *pTWI_MASTER_CTL = SCLOVR;

        delay(6);

        *pTWI_MASTER_CTL = 0;                                                                    

        delay(6);

} while ((*pTWI_MASTER_STAT & SDASEN) && (cnt++ < 8));

    *pTWI_MASTER_CTL = SDAOVR | SCLOVR;

    delay(6);

    *pTWI_MASTER_CTL = SDAOVR;
    
    delay(6);

    *pTWI_MASTER_CTL = 0;
    
    return ((*pTWI_MASTER_STAT & SDASEN) || (cnt == 8)) ? false : true;
}

/*******************************************************************
*   Function:    TWI_MasterMode_Write
*   Description: do a master mode write
*******************************************************************/
void TWI_MasterMode_Write(unsigned char DeviceAddr, unsigned char *TWI_Data_Pointer, unsigned short Count, unsigned char TWI_Length)
{
int i, j, timeout;

if (*pTWI_MASTER_STAT & SDASEN)
{
if(!ClrSclSda())
return;
}
/* make sure no previous errors occured */
if (TWISuccess == 1)
{
    *pTWI_FIFO_CTL = 0; /* clear the bit manually */
*pTWI_CONTROL = TWI_ENA | PRESCALE_VALUE | SCCB; /* 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) */

for (i = 0; i < Count; i++)
{
    /* # of configurations to send */
*pTWI_XMT_DATA8 = *TWI_Data_Pointer++; /* pointer to data */
ssync();
*pTWI_MASTER_CTL = (TWI_Length<<6) | MEN /*| FAST*/; /* start transmission */

timeout = 0x1000;
for (j = 0; j < (TWI_Length-1); j++)
{
    /* # of transfers before stop condition */
while ((*pTWI_FIFO_STAT == XMTSTAT) && --timeout) /* wait to load the next sample into the TX FIFO */ // TAR37913
{
ssync();
}
if(!timeout)
return;

*pTWI_XMT_DATA8 = *TWI_Data_Pointer++; /* load the next sample into the TX FIFO */
ssync();
}
timeout = 0x1000;
while (!(*pTWI_INT_STAT & MCOMP) && --timeout) /* wait until transmission complete and MCOMP is set */
{
ssync();
}
if(!timeout)
return;
/* check if an error occured */
if ((*pTWI_INT_STAT & MERR) == MERR)
{
*pTWI_INT_STAT |= MERR;
TWISuccess = 0;
}
*pTWI_INT_STAT = XMTSERV | MCOMP; /* service TWI for next transmission */
}
}

asm("nop;");
asm("nop;");
asm("nop;");
}


/*******************************************************************
*   Function:    TWI_MasterMode_Read
*   Description: do a master mode read
*******************************************************************/
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;");
}

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++;
}
}

void audio_close(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, AudioColse, 1, 2);
if(TWISuccess)
for (j=0; j<0x1ffffff; j++) asm("nop;");
/*** lastly activate the digital engine *******************/

if(!TWISuccess)
TWI_Error++;
}
}

这个程序是你们提供的bf51x_audio_mic中的程序,TWI的配置是按这个来吧,还要配置其他的寄存器吗,这个实时时钟是不是要配置成SLAVE模式?

夜空中最亮的星
等级:论坛新手 参考IP地址:*.*.*.*
2017/9/15 10:05:28
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
是的twi按这个来的。

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2017/9/18 8:12:11
feelingliang(论坛新手)
feelingliang
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:275
积分:27
注册时间:2017/9/14
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
您们这个例程中,有写MasterMode_Read这个函数,但是在初始化中只调用了MasterMode_Write这个函数,所以MasterMode_Read函数在这里没有用到是吗?


夜空中最亮的星
等级:论坛新手 参考IP地址:*.*.*.*
2017/9/20 10:52:16
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
这个程序是ADI写的,我们也没有深入研究每句话。。。

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2017/9/20 11:02:03
feelingliang(论坛新手)
feelingliang
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:275
积分:27
注册时间:2017/9/14
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
这个TWI_MasterMode_Write函数,是向从设备传输数据,这个参数DeviceAddr为从设备的地址, *TWI_Data_Pointer为向从设备传输的数据(这个数据包括了从设备相关寄存器的地址和应写入的相应的值),而要做的是 把数据传到从设备相应的寄存器内,在这个程序中,哪几条语句是向从设备的寄存器中写数据的,我没看出来。。

我对TWI配置的的理解不是很懂, 写入从设备地址,确定传输方向,配置完TWI相应的寄存器,就开始传输数据,但是一直没有写要传入的从设备的寄存器的地址,那我传输的数据都到哪里了,从设备的地址就是我数据被存放的地址吗(这应该不可能吧)。

夜空中最亮的星
等级:论坛新手 参考IP地址:*.*.*.*
2017/9/21 8:21:38
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
8信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
这个函数,送入设备地址后,你要配置每次传几个数据,如果你是每个寄存器传一个值,就配置为2,传输数据里,寄存器和值交替排列。你到我们网站上把音频那个例子代码下下来看看就明白了。


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2017/9/21 12:12:19
feelingliang(论坛新手)
feelingliang
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:275
积分:27
注册时间:2017/9/14
9信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
您好,我看的就是音频的代码,还有,我没弄清楚的是下边的代码
(1)*pTWI_CONTROL = TWI_ENA | PRESCALE_VALUE; /* PRESCALE = fsclk/10MHz */
手册上说 PRESCALE位,是系统时钟和TWI控制器内部时间事件建立联系,这个什么意思?假如我系统时钟的频率是400M,那么这个分频40,这个40分频是什么意思?

(2)串行时钟的频率是在TWI_MASTER_CTL 寄存器的的 Fast mode (FAST)配置的,0:标准模式(up to 100K bits/s),1:快速模式(up to 400K bits/s),假如我配置的是0,串行时钟的频率具体是多少,就是100Kbits/s ,还是其他值,如果是其他值得话,那应该是多少呢?

夜空中最亮的星
等级:论坛新手 参考IP地址:*.*.*.*
2017/9/21 21:53:20
14
1
1/2
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159394 Call, 1 Queries, Processed in 0.032227 second(s),