zoukankan      html  css  js  c++  java
  • TLV320AIC3268寄存器读写

    该芯片支持I2C和SPI读写寄存器,本人用的是SPI1接口。

    以下是对手册中SPI接口读写寄存器相关内容的翻译(英文版可以看手册的94页~)

    在SPI控制模式下,TLV320AIC3268使用SCL_SSZ作为片选信号 ,I2C_ADDR_SCLK 作为 SCLK,MISO_GPO1 作为 MISO, SDA_MOSI 作为 MOSI; CPOL = 0 CPHA = 1。

    SPI接口支持主从设备间的全双工、同步、串行通信。SPI主设备产生同步时钟(SCLK)并且启动传输。字节从主机出发沿着MOSI线伴随SCK时钟控制发出,当一个字节沿着MOSI发送给从机时,从机同时沿着MISO回传一个字节。 

    TLV320AIC3268需要设置CPHA=1,所以主设备驱动MOSI和从设备驱动MISO都是在第一个串行时钟边沿, SSZ片选信号在传输过程中需要一直保持低电平。

    TLV320AIC3268只把SSZ拉低后的头8位当作控制命令,并且当写寄存器的时候接下来8位是要写入的数据。 

    TLV320AIC3268完全通过寄存器配置。 读写这些寄存器需要由主机发送一个8位的命令. 命令的格式参照 Table 43。 头7位是要读写寄存器的地址(从0到127,十进制),最后一位是读写位。

     

    下面是对寄存器读写操作的代码样例(仅供参考)

    /**********************************************************
    函数名称 : AIC3268_Set_Book
    入口参数 : Book  需要操作的Book
    返回参数 : None
    功能介绍 : 实现对 对 AIC3268 的操作 切换Book
    **********************************************************/
    void AIC3268_Set_Book(u8 Book)
    {
        
        AIC3268_Set_Page(0);  //切换到page0
        
        AIC3268_CS_LOW;
        preBook = Book;
        SPI1_ReadWriteByte(127<<1 & 0xfe); //定位第127个寄存器
        SPI1_ReadWriteByte(Book);
        AIC3268_CS_HIGH;
    }
    /**********************************************************
    函数名称 : AIC3268_Set_Page
    入口参数 : Page  需要操作的页
    返回参数 : None
    功能介绍 : 实现对 对 AIC3268 的操作 切换页
    **********************************************************/
    void AIC3268_Set_Page(u8 Page)
    {
        AIC3268_CS_LOW;
        prePage = Page;
        SPI1_ReadWriteByte(0<<1 & 0xfe); //定位第0个寄存器
        SPI1_ReadWriteByte(Page);
        AIC3268_CS_HIGH;
    }
    /**********************************************************
    函数名称 : AIC3268_Write_Byte
    入口参数 :u32 reg 24位寄存器地址; u8 val 寄存器数值
    返回参数 :None
    功能介绍 :函数实现了对单个寄存器的写入操作在
                         写寄存器之前需要设置写入的book,page 用户不要调用这个函数
    **********************************************************/
    void AIC3268_Write_Byte(u32 addr,u8 val)
    {
        AIC3268_Check_Book(addr>>16);        //检查是否切换Book
        AIC3268_Check_Page((addr>>8)&0x00ff);//检查是否切换Page
    
        preReg = addr&0x0000ff;              //计算当前操作的寄存器
        
        AIC3268_CS_LOW;
        SPI1_ReadWriteByte(preReg<<1 & 0xfe);
        SPI1_ReadWriteByte(val);
        AIC3268_CS_HIGH;
    }
    /**********************************************************
    函数名称 : AIC3268_Write_Half_Word
    入口参数 :u32 first_reg 第一个寄存器的地址; u16 val 寄存器数值
    返回参数 :None
    功能介绍 :函数实现了对两个寄存器的连续写入操作在
                         写寄存器之前需要设置写入的book,page 用户不要调用这个函数
    **********************************************************/
    void AIC3268_Write_Half_Word(u32 first_reg,u16 val)
    {
        AIC3268_Check_Book(first_reg>>16);        //检查是否切换Book
        AIC3268_Check_Page((first_reg>>8)&0x00ff);//检查是否切换Page
        
        preReg = first_reg&0x0000ff;              //计算当前操作的寄存器
        
        AIC3268_CS_LOW;
        SPI1_ReadWriteByte((uint8_t)(preReg<<1 & 0xfe));
        SPI1_ReadWriteByte((uint8_t)((val&0xff00)>>8));
    
        //SPI1_ReadWriteByte((uint8_t)(preReg<<1 & 0xfe));
        SPI1_ReadWriteByte((uint8_t)((val&0x00ff)));
        AIC3268_CS_HIGH;
    }
    /**********************************************************
    函数名称 :AIC3268_Read_Byte
    入口参数 :u32 addr  寄存器的地址
    返回参数 :u8 val  寄存器的数据
    功能介绍 :函数实现了对单个寄存器的数据的读取
                         读取之前需要先选中book,page
    **********************************************************/
    u8   AIC3268_Read_Byte(u32 addr)
    {
        u8 val = 0;
        AIC3268_Check_Book((u8)addr>>16);
        AIC3268_Check_Page((u8)((addr>>8)&0x00ff));
    
        preReg = addr&0x0000ff;
        
        AIC3268_CS_LOW;
        SPI1_ReadWriteByte(preReg<<1 | 0x01);
        val = SPI1_ReadWriteByte(DUMMY);
        AIC3268_CS_HIGH;
        return val;
    }
    /**********************************************************
    函数名称 :AIC3268_Show_Regs
    入口参数 :u8 Book  寄存器所在的Book
               u8 Page  寄存器所在的Page
    返回参数 :无
    功能介绍 :函数实现了将特定Book、Page中所有寄存器的数值打印
               到串口
    **********************************************************/
    void AIC3268_Show_Regs(u8 Book,u8 Page)
    {
        u8 i = 0;
        
        AIC3268_Check_Book(Book);
        AIC3268_Check_Page(Page);
        
        for(i=0;i<=127;i++)
        {
            AIC3268_CS_LOW;
            SPI1_ReadWriteByte(i<<1 | 0x01);
            printf("in book %d,page %d,reg %d(0x%x),val = %d
    ",Book,Page,i,i,SPI1_ReadWriteByte(DUMMY));
            AIC3268_CS_HIGH;
        }
        
    }
    /**********************************************************
    函数名称 :AIC3268_Check_Book
    入口参数 :u8 Book  寄存器所在的Book
    返回参数 :无
    功能介绍 :函数实现了检查操作当前的寄存器需不需要切换Book
    **********************************************************/
    void AIC3268_Check_Book(u8 Book)
    {
        if(Book != preBook)
        {
            //preBook = Book;
            AIC3268_Set_Book(Book);
        }
        
    }
    /**********************************************************
    函数名称 :AIC3268_Check_Page
    入口参数 :u8 Page  寄存器所在的Page
    返回参数 :无
    功能介绍 :函数实现了检查操作当前的寄存器需不需要切换Page
    **********************************************************/
    void AIC3268_Check_Page(u8 Page)
    {
        if(Page != prePage)
        {
            //prePage = Page;
            AIC3268_Set_Page(Page);
        }
        
    }

  • 相关阅读:
    String.Intern原来可以减少占用内存···
    一些话···
    javascript 闭包和原型 (转载)
    20100610
    jQuery选择头像
    20100611
    新的一天又开始了····
    13种常用按钮、文本框、表单等CSS样式
    心悸···
    我对她说,你能不能换件衣服?换种心情?换种脾气?她说,可以,换个人就行了···
  • 原文地址:https://www.cnblogs.com/Irvingcode/p/11738108.html
Copyright © 2011-2022 走看看