|
最近测试cs5460这款计量芯片 有好一段时间了 中间耽误了很久 一直没能正确读取数据
其芯片连接图及负载接线图 如下所示
主控芯片 stm32103 c8t6
采用 spi通讯
现测试读取电压电流数据 总是读取不到 读取状态寄存器也是如此
示波器观察 主控芯片mosi脚 数据发送正常
检查时序 也未发现问题 程序如下
spi配置
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* SPI1 Periph clocks enable */
RCC_APB2PeriphClockCmd (RCC_APB2Periph_SPI1, ENABLE);
/* GPIOB clock enable */
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE);
/* SCK, MISO and MOSI PA5=CLK,PA6=MISO,PA7=MOSI*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* PA4 作片选*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_4); //预置为高,低电平有效
/* PB10 作复位*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_2); //预置为高,低电平有效
GPIO_SetBits(GPIOB, GPIO_Pin_10); //预置为高,低电平有效
/* SPI1 configuration */
SPI_Cmd(SPI1, DISABLE); //必须先禁能,才能改变MODE
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //两线全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //CPOL=0 时钟悬空低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //CPHA=0 数据捕获第1个
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件NSS
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //4分频=9M < 25M (LOW READ)
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
写cs5460
uint8_t SPI_Send_Byte(uint8_t data)
{
//while( SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET)//wait for TXE
//SPI_I2S_SendData(SPI1,data);
//while( SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET);//wait for RXNE
//return SPI_I2S_ReceiveData(SPI1);
while((SPI1->SR & SPI_I2S_FLAG_TXE)==RESET); /*等待发送寄存器空*/
SPI1->DR = data; /*发送一个字节*/
while((SPI1->SR & SPI_I2S_FLAG_RXNE)==RESET); /* 等待接收寄存器有效*/
return(SPI1->DR);
}
void Write_CS5460(uint8_t Len)
{
char i = 0;
SelectCS5460;
for(;i
{
SPI_Send_Byte(buf5460);
}
DeselectCS5460;
}
读取cs5460
void Read_CS5460(uint8_t Register_Num)
{
char i = 0;
SelectCS5460;
SPI_Send_Byte(Register_Num);
for(;i<3;i++)
{
Buf5460=SPI_Receive_Data();
}
DeselectCS5460;
}
芯片初始化
void Init_CS5460(void)
{
Soft_Reset_OFF;//复位序列
delay_nms(30);//........
Soft_Reset_ON;//复位序列
//delay_nms(999);
//Init_Serial();
buf5460[0]=0xFF;
buf5460[1]=0xFF;
buf5460[2]=0xFF;
buf5460[3]=0xFE;
Write_CS5460(4);//初始化序列
//Power_ON_HaltSys();
//Clear_DRDY();
buf5460[0]=0x40;
buf5460[1]=0x00;
buf5460[2]=0x18;
buf5460[3]=0xE1;
Write_CS5460(4);//写配置寄存器
buf5460[0]=0x5E;
buf5460[1]=0xFF;
buf5460[2]=0xFF;
buf5460[3]=0xFF;
Write_CS5460(4);//清状态寄存器
buf5460[0]=0x74;
buf5460[1]=0x00;
buf5460[2]=0x00;
buf5460[3]=0x00;
Write_CS5460(4);//写中断屏蔽寄存器
buf5460[0]=0x78;
buf5460[1]=0x00;
buf5460[2]=0x00;
buf5460[3]=0x00;
Write_CS5460(4);//写控制寄存器
buf5460[0]=0x4C;
buf5460[1]=0x00;
buf5460[2]=0x34;
buf5460[3]=0x9C;
Write_CS5460(4);//写EOUT脉冲输出寄存器
buf5460[0]=0x4A;
buf5460[1]=0x00;
buf5460[2]=0x0F;
buf5460[3]=0xA0;
Write_CS5460(4);//写CYCLE COUNT寄存器
buf5460[0]=0x44;
buf5460[1]=0x40;//增益1
buf5460[2]=0x00;
buf5460[3]=0x00;
Write_CS5460(4);//写电流增益寄存器
buf5460[0]=0x48;
buf5460[1]=0x40;//增益1
buf5460[2]=0x00;
buf5460[3]=0x00;
Write_CS5460(4);//写电压增益寄存器
Read_CS5460(0x1E);
buf5460[3]=Buf5460[2];
buf5460[2]=Buf5460[1];
buf5460[1]=Buf5460[0];
buf5460[0]=0x5e;
Write_CS5460(4);//写状态寄存器
}
帮忙看看啦
|
|