TI中文支持网
TI专业的中文技术问题搜集分享网站

用SSI和DAC8534实现DAC转换问题

如果用DAC8534实现DAC转换该怎么设置?

用SSIConfigSetExpClk()函数只能设置发送数据宽度为4~16,而DAC8534为16位DAC转换芯片,每次发送24为前面八位为控制位,决定从ABCD哪个通道输出。要怎么设置才能实现SSI与DAC8534之间的数据传输呢?

Maka Luo:

如果是24bits,可以用8位宽度,FIFO深度设为3就好,8*3 = 24 

每次发送24为前面八位为控制位,决定从ABCD哪个通道输出。要怎么设置才能实现SSI与DAC8534之间的数据传输呢?

这个问题是指什么意思?没看明白。

LiangLiang wang1:

回复 Maka Luo:

用哪个库函数进行设置呢?设置完比如说前8位固定0xA0,要发送一个不停变化的16位的数,用变量Num代替。该怎么发送呢?

xyz549040622:

回复 LiangLiang wang1:

void
SSIDataPut(uint32_t ui32Base,
uint32_t ui32Data)

用这个函数发送数据就好了。用num代替ui32Data就好了。注意手册上的这个说明

The upper 32 - N bits of ui32Data are discarded by the hardware, where N is the data width as
configured by SSIConfigSetExpClk(). For example, if the interface is configured for 8-bit data
width, the upper 24 bits of ui32Data are discarded.

如果发送的是8位数据的话,有24位是无效的。

LiangLiang wang1:

回复 xyz549040622:

Num是个16位的啊,怎么能那样发呢?你的意思是不是用SSIDataPut()发送三次,第一次发送前面八位控制位,第二次发送Num的高八位,第三次发送Num的低八位

也就是:

SSIDataPut(SSI0_BASE,0xA0);

SSIDataPut(SSI0_BASE,(0xFF00&Num)>>4);

SSIDataPut(SSI0_BASE,0x00FF&Num);

是这样吗?这样行的通吗?

xyz549040622:

回复 LiangLiang wang1:

理论是可以的,具体需要测试。你为什么不把这三个,组合为一个u32的数据呢。

LiangLiang wang1:

回复 xyz549040622:

SSIConfigSetExpClk()函数中数据帧长度只能是4~16位,SSIConfigSetExpClk()函数中数据帧长度确定了,SSIDataPut()发送的数据的有效位数就确定了,如果组合成U32怎么发送呢?

LiangLiang wang1:

回复 Maka Luo:

我的意思是DAC8534数据输入寄存器的格式是24位的,D23和D22位为地址选择,D21和D20位为输出通道加载位,D19不用管,D18和D17位为信号输出通道选择位,D16位为电源下拉模式选择标志位。后16位为用于DAC转换的数据位。SSIConfigSetExpClk()能发送的数据帧长度范围为4~16,如果要用DAC8534对一个16位的变量实现DAC转换,那么DAC8534数据输入寄存器的前面8位怎么写进去呢?

xyz549040622:

回复 LiangLiang wang1:

// Read any residual data from the SSI port.This makes sure the receive// FIFOs are empty, so we don't read any unwanted junk.This is done here// because the SPI SSI mode is full-duplex, which allows you to send and// receive at the same time.The SSIDataGetNonBlocking function returns// "true" when data was returned, and "false" when no data was returned.// The "non-blocking" function checks if there is any data in the receive// FIFO and does not "hang" if there isn't.//while(SSIDataGetNonBlocking(SSI0_BASE, &pui32DataRx[0])){}//// Initialize the data to send.//pui32DataTx[0] = 's';pui32DataTx[1] = 'p';pui32DataTx[2] = 'i';//// Display indication that the SSI is transmitting data.//UARTprintf("Sent:\n");//// Send 3 bytes of data.//for(ui32Index = 0; ui32Index < NUM_SSI_DATA; ui32Index++){//// Display the data that SSI is transferring.//UARTprintf("'%c' ", pui32DataTx[ui32Index]);//// Send the data using the "blocking" put function.This function// will wait until there is room in the send FIFO before returning.// This allows you to assure that all the data you send makes it into// the send FIFO.//SSIDataPut(SSI0_BASE, pui32DataTx[ui32Index]);}

前8位数据左移16位然后和后16位相或不就可以了么。虽然SSIConfigSetExpClk()能发送的数据帧长度范围为4~16,但是

SSIDataPut的参数是u32的。你可以可以单独8位8位的发,一起组合为一个u32的数据需要你测试下,没看数据手册,不知道SSIConfigSetExpClk()能发送的数据帧长度范围为4~16是否就是SSI的FIFO的长度呢?如果是的话,那就不能组合了。

Linfa Xiao:

回复 xyz549040622:

1.用FIFO,每一级的FIFO发完后会拉高片选吗(SYNC)?
DAC8534手册上要求24bit移位结束之前是不能拉高SYNC的。否则之前的移位数据无效。
你这种每次8位,然后FIFO的方式能用吗?

2.第二个问题,如果片选SYNC由普通IO口来模拟,且同时使能FIFO,这样可以吗?软件在什么时候拉高或拉低,怎么知道24bit啥时移位完成?

赞(0)
未经允许不得转载:TI中文支持网 » 用SSI和DAC8534实现DAC转换问题
分享到: 更多 (0)