音频线路da以后的部分都是硬件实现,软件上只需要通过lssp控制
da芯片的输入即可,da芯片我们选用的是tlc5618,是spi接口,
spi协议是cs为高时,每个clk下沿出一位数据,这款5618的数据位数是12位。
lssp具有16个gpio口,每个口都可以进行配置成输入或输出。
现在我将0号io口接到cs,1号接到clk,2号接到data。
地址3FEF是io使能寄存器地址,3FF0是gpio输出寄存器地址。
因为可能会有其他程序控制其他gpio端口,所以要先读取所有值,与当前值或后在写入。
现在实现的只是一个12位数据的输出,可以加入循环进行连续输出。
此程序实现的是双声道的控制。
汇编程序如下:
MOV R0,#0X0
MOV R1,#0X3FEF ;GPIO[7:0]赋能位
MOVO @R1,#0X7 ;设置GPIO[2:0]输出enable
MOV R2,#0X3FF0 ;设置GPIO[7:0]访问地址
MOVO @R2,#0X1 ;GPIO[2:0]输出high电平
PLAY:
WRITE_BUFFER:
;write to double buffer
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X2
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X0
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X2
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X0
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X2
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X0
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X6
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X4
MOVO @R2,R8
MOV R14,#12
MOV R9,#0X200
DATA_B:
AND R10,R13,R9
JCEQ R10,R0,LOW_B
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X6
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X4
MOVO @R2,R8
JMPI OVER_B
LOW_B:
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X2
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X0
MOVO @R2,R8
OVER_B:
RS R9
SUB R14,R14,#1
JCNE R14,R0,DATA_B
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X2
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X3
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X1
MOVO @R2,R8
WRITE_A:
;write to a and update b
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X6
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X4
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X2
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X0
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X2
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X0
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X2
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X0
MOVO @R2,R8
MOV R14,#12
MOV R9,#0X200
DATA_A:
AND R10,R13,R9
JCEQ R10,R0,LOW_A
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X6
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X4
MOVO @R2,R8
JMPI OVER_A
LOW_A:
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X2
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X0
MOVO @R2,R8
OVER_A:
RS R9
SUB R14,R14,#1
JCNE R14,R0,DATA_A
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X2
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X3
MOVO @R2,R8
NOP 3
MOVI R8,@R2
AND R8,R8,#0XFFF8
OR R8,R8,0X1
MOVO @R2,R8
NOP 3