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\n",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); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」