问:ADA4350可写不可读是怎么回事,如何实现串口读写?
1ADA4350简介
ADA4350集成TIA、开关及差分放大器在一个封装内,非常适合对光电器件输出的电流进行信号调理。芯片内部的六组开尔文式开关有两种用法,既可以六组都给TIA用,这样外部可配置六个不同电阻实现六种增益,覆盖不同的输入电流范围;也可以TIA用三组开关,剩下的三组给后面的运放使用,共实现3x3
= 9种的增益。输出运放可配置为差分输出直接驱动差分输入ADC。
芯片内部的六组开关,可以通过IO口并行控制,也可以用SPI串行控制,SPI时序图和寄存器Map定义见芯片资料。
图|ADA4350内部框图
2SPI测试硬件环境
用STM32F103C8Tx的SPI口(PA4~PA7)控制ADA4350EVB.
ADA4350EVB配置如下:
DVDD短路到VCC, DGND短路到GND,E3631A提供+/-5V电源给VCC和VEE;
MODE接低(串行模式),ENABLE接高,LATCH接低;
并口模式下控制P0 ~ P4的开关切换到高电平(否则ADA4350的20~23脚接地,MCU无法进行控制);
将MCU控制板的CS/SCK/SDI/SDO共5根线连接到ADA4350EVB的20~23脚(SPI管脚)进行控制,两板的地短接。用示波器抓取
CS/SCK/SDI/SDO时序。
3测试时序图
测试时序图见下,
先写0x000820到ADA4350,即控制S11和S5导通;
再读,先写0x800000告诉芯片要读寄存器,然后SDO线上会出现0x800820,最高位无效,最低12位为0x820,即刚写进去的值;
需要注意的是在读写过程中,SCK下降沿有效。
图|ADA4350 SPI时序图
4参考代码
代码无他,需要注意灵活配置MCU的SPI,使之与ADA4350时序需求匹配即可。
参考代码
代码无他,需要注意灵活配置MCU的SPI,使之与ADA4350时序需求匹配即可。
int main(void)
{
while (1)
{
//Write 0x000820(enable S5 and S11 of ADA4350)
SPI_write_ADA4350(3,0x000820);
//Read the register value
SPI_read_ADA4350(3,0x800000);
//Print the reading value by UART
HAL_UART_Transmit(&huart1,Read_dvalue,3,0xFFFF);
//LED Blink
Led_blink();
Delay_ms(200); }
}
/***** SPI1 Initialization Function /
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler =
SPI_BAUDRATEPRESCALER_64;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation =
SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if(HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
/ SPI WriteADA4350 /
void SPI_write_ADA4350(uint8_tsize,uint32_t data_value)
{
SPI_CS_HIGH //CS HIGH
SPI_CS_LOW //CS LOW
//SPI write 0x000820
SPI_write_buffer[0]=(uint8_t)((data_value&0x00ff0000)>>16);
SPI_write_buffer[1]=(uint8_t)((data_value&0x0000ff00)>>8);
SPI_write_buffer[2]=(uint8_t)(data_value&0x000000ff);
//write 3 bytes
HAL_SPI_Transmit(&hspi1, SPI_write_buffer, size, 0x2000);
SPI_CS_HIGH //CS HIGH
Delay_us(5);
}
/ SPI ReadADA4350 **/
uint8_t SPI_read_ADA4350(uint8_tsize,uint32_t data_value)
{
SPI_CS_HIGH //CS HIGH
SPI_CS_LOW //CS LOW
//SPI write 0x800000
SPI_write_buffer[0]=(uint8_t)((data_value&0x00ff0000)>>16);
SPI_write_buffer[1]=(uint8_t)((data_value&0x0000ff00)>>8);
SPI_write_buffer[2]=(uint8_t)(data_value&0x000000ff);
//write 3 bytes
HAL_SPI_Transmit(&hspi1, SPI_write_buffer, size, 0x2000);
SPI_CS_HIGH //CS HIGH
Delay_us(2);
//SPI RX
SPI_CS_LOW //CS LOW
//Read data into the Read_dvalue array
HAL_SPI_Receive(&hspi1,Read_dvalue,size,0x2000);
SPI_CS_HIGH //CS HIGH
Delay_us(5);
return 1;
}
全部0条评论
快来发表一下你的评论吧 !