最近在弄一个ADAU 1452 DSP音频项目,需要使用safeload模式进行数据更新,避免DSP带来的噪音问题。在网上找了一些safeload相关的,发现验证都不对。最后在官方的手册找到我想要的答案,并在项目中验证通过。记录分享一下:
首先关于safeload 地址问题,可以从手册中看到,sigmastudio v3.14以后的版本,地址固定在0x6000.
图中为sigmastudio导出的文件中有一个******PARAM.h的文件中可以看到,确实地址为24576,对应的0x6000.
接下来我们看safeload 操作步骤:
/*
* ADAU1452 Sigmastudio Safeload write through SPI
* step 1. write target address to safeload address register, address start with 0x6000.
* step 2. write target data to safeload data register, address start with 0x6005.
* step 3. set bit IST in DSP CORE control register, address 0x6006, to inital safeload transmitter.
*/
代码如下:
void SIGMA_SAFELOAD_WRITE_REGISTER(int devAddress,int Targetaddress, int length, ADI_REG_TYPE *pData)
{
#if 1
uint8_t subTargetaddress0, SafeLoad_subaddress0;
uint8_t subTargetaddress1, SafeLoad_subaddress1;
uint8_t cmd[3];
uint8_t data[4];
//safepara
SafeLoad_subaddress0 = (__SafeLoad_Module__Address & 0xFF00)>>8;
SafeLoad_subaddress1 = __SafeLoad_Module__Address & 0x00FF;
/* Configure the command */
cmd[0] = devAddress;
cmd[1] = SafeLoad_subaddress0;
cmd[2] = SafeLoad_subaddress1;
// write target data to Address "__SafeLoad_Module__"
GPIO_ResetBits(USBI_SPI1_CS_GPIO_Port,USBI_SPI1_CS_Pin);
/* Send the command */
SPI_WriteBlock(cmd,3);
/* Transmission of the data */
SPI_WriteBlock(pData,length);
//GPIO_SetBits(USBI_SPI1_CS_GPIO_Port,USBI_SPI1_CS_Pin);
delay_ms(1);
//Target address
//GPIO_ResetBits(USBI_SPI1_CS_GPIO_Port,USBI_SPI1_CS_Pin);
subTargetaddress0 = (Targetaddress & 0xFF00)>>8;
subTargetaddress1 = Targetaddress & 0x00FF;
/* Configure the command */
cmd[0] = devAddress;
cmd[1] = SafeLoad_subaddress0;
cmd[2] = SafeLoad_subaddress1+5;
/* Send the command */
SPI_WriteBlock(cmd,3);
//Target address 4bytes
data[0]= 0;
data[1]= 0;
data[2]= subTargetaddress0;
data[3]= subTargetaddress1;
/* Send the command */
SPI_WriteBlock(data,4);
delay_ms(1);
//num_SafeLoad for safeload transfer
//GPIO_ResetBits(USBI_SPI1_CS_GPIO_Port,USBI_SPI1_CS_Pin);
/* Configure the command */
cmd[0] = devAddress;
cmd[1] = SafeLoad_subaddress0;
cmd[2] = SafeLoad_subaddress1+6;
/* Send the command */
SPI_WriteBlock(cmd,3);
//num_SafeLoad 4bytes
data[0]= 0;
data[1]= 0;
data[2]= 0;
data[3]= 1;
/* Send the command */
SPI_WriteBlock(data,4);
GPIO_SetBits(USBI_SPI1_CS_GPIO_Port,USBI_SPI1_CS_Pin);
delay_ms(1);
#else
uint8_t cmd[3];
/* Calculation of the size between the write address and the end of the page */
/* Perform the write page by page */
/* Configure the command */
cmd[0] = devAddress;
cmd[1] = (uint8_t)(Targetaddress >> 8);
cmd[2] = (uint8_t)(Targetaddress);
/* Enable write operations */
GPIO_ResetBits(USBI_SPI1_CS_GPIO_Port,USBI_SPI1_CS_Pin);
/* Send the command */
SPI_WriteBlock(cmd,3);
/* Transmission of the data */
SPI_WriteBlock(pData,length);
GPIO_SetBits(USBI_SPI1_CS_GPIO_Port,USBI_SPI1_CS_Pin);
#endif
}
void setMusicEqOn(void)
{
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x0043, 4, MODE_2_0); /* EQS300MultiS3B2_1 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x0044, 4, MODE_2_1); /* EQS300MultiS3B1_1 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x0045, 4, MODE_2_2); /* EQS300MultiS3B0_1 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x0046, 4, MODE_2_3); /* EQS300MultiS3A2_1 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x0047, 4, MODE_2_4); /* EQS300MultiS3A1_1 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x6019, 4, MODE_2_5); /* EQS300MultiS3B2_2 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x601A, 4, MODE_2_6); /* EQS300MultiS3B1_2 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x601B, 4, MODE_2_7); /* EQS300MultiS3B0_2 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x601C, 4, MODE_2_8); /* EQS300MultiS3A2_2 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x601D, 4, MODE_2_9); /* EQS300MultiS3A1_2 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x0048, 4, MODE_2_10); /* EQS300MultiS3B2_3 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x0049, 4, MODE_2_11); /* EQS300MultiS3B1_3 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x004A, 4, MODE_2_12); /* EQS300MultiS3B0_3 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x004B, 4, MODE_2_13); /* EQS300MultiS3A2_3 */
SIGMA_SAFELOAD_WRITE_REGISTER( DEVICE_ADDR_IC_1 , 0x004C, 4, MODE_2_14); /* EQS300MultiS3A1_3 */
}
图中SPI操作部代码我这里就没有提供了,网上到处能找到。