使用STM32mini板配置AD7175-2时,读取AD7175-2的ID寄存器,读取到的值一直会变动,出现异常,请问是什么问题,时序和代码如下。
通信寄存器控制对ADC全部寄存器映射的访问。此寄存器
是一个8位只写寄存器。上电或复位后,数字接口默认处
于期待对通信寄存器执行一个写操作的状态;要验证器
通信是否正常,建议读取ID寄存器。 ID寄存器
是一个只读寄存器,对于AD7175-2,其值为0x0CDX。
void SPI1_Init(void)
{ SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1|RCC_APB2Periph_AFIO, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;//PA6配置成上拉输入 PA6 DOUT
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//SPI PA4 CS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_7; /* PA5 CLK PA7 DIN*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
SPI_Cmd(SPI1, DISABLE); //失能能SPI外设
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;/**/
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;/*此处根据AD7175-2数据手册进行配置*/
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI1, ENABLE); //使能SPI外设
void Init_AD7175(void)
{
u16 ID = 0;
u16 IDH = 0;
u16 IDL = 0;
u8 i;
for(i=0;i<100;i++)/* 多于连续64个 DIN=1 使串口复位 */
{
CS_ADC_LOW();// 使能器件
delay_us(200);
AD7175_WriteByte(0xff);//持续DIN高电平写操作,恢复AD7175接口
delay_us(200);
CS_ADC_HIGH();//失能器件
}
CS_ADC_LOW();//使能器件
delay_us(2000);
SPI1_ReadWriteByte(0x47);//持续DIN高电平写操作,恢复AD7705接口
delay_us(100);
IDH = SPI1_ReadWriteByte(0xff);
IDL = SPI1_ReadWriteByte(0xff);
delay_us(2000);
CS_ADC_HIGH();//失能器件
ID = (IDH << 8) | IDL;
LCD_ShowxNum(60,130,ID,16,16,0);//显示ID寄存器
delay_ms(1000);
}
|