您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF51X技术支持专区 -> 关于BF512的TWI应用问题?求助
本帖共有662个阅读者
发表帖子 发表投票 回复主题
关于BF512的TWI应用问题?求助
tdytdy163(论坛新手)
tdytdy163
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:174
积分:12
注册时间:2013/5/16
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
关于BF512的TWI应用问题?求助

void TWI_MasterMode_Write(unsigned short DeviceAddr, unsigned char *TWI_Data_Pointer, unsigned short Count, unsigned short 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;            /* 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;");
}

这个是TWI写程序,我想问问写入的话先要找到从机地址,再找到寄存器地址,再写入数据,我怎么调用这个函数啊,它就只有一个形参是从机地址,我怎么写入从机内部寄存器地址??


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/5/16 19:49:18
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

unsigned char AudioConfig[] = {
PWDC, 0,
LLVC, 0x1d,
RLVC, 0x1d,
LHVC, 0x70,
RHVC, 0x70,
AAPC, 0x32,
DAPC, 0x06,
DAIF, 0x52,
SARC, 0x1,
DIAC, 0xC1,
};

TWI_MasterMode_Write( AIC23B_ADDRESS>>1, AudioConfig, 10, 2);

设备地址是7位的,所以包含读写位的设备地址要去掉读写位, AudioConfig 是要写入寄存器的buffer,10表示写入10次,2表示每次写2位,即一个寄存器地址,一个数据。

BF51x上的TWI总体感觉不是很好用,对于某些IIC器件可能会出现寄存器配置不成功,官方提供的代码也采用了判断重复写入的机制,使用时需注意。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/5/16 20:08:49
tdytdy163(论坛新手)
tdytdy163
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:174
积分:12
注册时间:2013/5/16
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

我这样可以吗?

TWI_MasterMode_Write(SlaveAddress>>1, REG_Address, 1, 1);//先找到从机的寄存器地址
TWI_MasterMode_Write(SlaveAddress>>1, REG_data, 1, 1);    //再发数据到从机的寄存器上

这样是正确的吗



这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/5/16 20:15:22
tdytdy163(论坛新手)
tdytdy163
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:174
积分:12
注册时间:2013/5/16
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

那么读数据也是这样吗?

void TWI_MasterMode_Read(unsigned short DeviceAddr, unsigned char *TWI_Data_Pointer, unsigned short Count)



这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/5/16 20:24:01
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

可以,但写入的数据可能无效,因为有可能处理器认为IIC只写了1个寄存器的地址,并没有给地址赋值,就结束了。你试试。



「该帖子被 andy 在 2013-05-18 02:08:19 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/5/18 2:02:19
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154382 Call, 1 Queries, Processed in 0.031250 second(s),