ADA4350如何实现串口读写

描述

问:ADA4350可写不可读是怎么回事,如何实现串口读写?

1ADA4350简介

ADA4350集成TIA、开关及差分放大器在一个封装内,非常适合对光电器件输出的电流进行信号调理。芯片内部的六组开尔文式开关有两种用法,既可以六组都给TIA用,这样外部可配置六个不同电阻实现六种增益,覆盖不同的输入电流范围;也可以TIA用三组开关,剩下的三组给后面的运放使用,共实现3x3
= 9种的增益。输出运放可配置为差分输出直接驱动差分输入ADC。

芯片内部的六组开关,可以通过IO口并行控制,也可以用SPI串行控制,SPI时序图和寄存器Map定义见芯片资料。

IO口

图|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下降沿有效。

IO口

图|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;

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分