中级会员
 
- 积分
- 212
- 金钱
- 212
- 注册时间
- 2021-4-4
- 在线时间
- 45 小时
|
6金钱
主控芯片为STM32.使用CS5460测功率,CS5460没有回应,总是卡死在读取SPI接收缓存区是否为空的循环当中,观看示波器波形输出没问题。
程序如下:
uint8_t SpiX_ReadOneByte(uint8_t SpiX)
{
uint8_t retry=0;
// if(SpiX==1)
// {
// while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET)
// {
// retry++;
// if(retry>200)
// {
// retry=0;
// return 1;
// }
// }
// retry=0;
// SPI_I2S_SendData(SPI1,0xFF);
//
// while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET)
// {
// retry++;
// if(retry>200)
// {
// retry=0;
// return 1;
// }
// }
// return SPI_I2S_ReceiveData(SPI1);
//
// }
//else
if(SpiX==2)
{
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET)
{
retry++;
if(retry>200)
{
retry=0;
return 1;
}
}
retry=0;
SPI_I2S_SendData(SPI2,0xFF);
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET)
{
retry++;
if(retry>200)
{
retry=0;
return 1;
}
}
return SPI_I2S_ReceiveData(SPI2);
}
// else if(SpiX==3)
// {
// while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE)==RESET)
// {
// retry++;
// if(retry>200)
// {
// retry=0;
// return 1;
// }
// }
// retry=0;
// SPI_I2S_SendData(SPI3,0xFF);
//
// while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE)==RESET)
// {
// retry++;
// if(retry>200)
// {
// retry=0;
// return 1;
// }
// }
// return SPI_I2S_ReceiveData(SPI3);
//
// }
};
uint8_t SpiX_WriteOneByte(uint8_t dat,uint8_t SpiX)
{
uint8_t retry=0;
// if(SpiX==1)
// {
// while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET)
// {
// retry++;
// if(retry>200)
// {
// retry=0;
// return 1;
// }
// }
// retry=0;
// SPI_I2S_SendData(SPI1,dat);
//
// while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET)
// {
// retry++;
// if(retry>200)
// {
// retry=0;
// return 1;
// }
// }
// SPI_I2S_ReceiveData(SPI1);
// return 0;
// }
//else
if(SpiX==2)
{
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET)
{
retry++;
if(retry>200)
{
retry=0;
return 1;
}
}
retry=0;
SPI_I2S_SendData(SPI2,dat);
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET)
{
retry++;
if(retry>200)
{
retry=0;
return 1;
}
}
SPI_I2S_ReceiveData(SPI2);
return 0;
}
// else if(SpiX==3)
// {
// while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE)==RESET)
// {
// retry++;
// if(retry>200)
// {
// retry=0;
// return 1;
// }
// }
// retry=0;
// SPI_I2S_SendData(SPI3,dat);
//
// while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE)==RESET)
// {
// retry++;
// if(retry>200)
// {
// retry=0;
// return 1;
// }
// }
// SPI_I2S_ReceiveData(SPI3);
// return 0;
// }
};
void CS5460_Init(void)
{
uint8_t Cs5460_RegDat[4];
//软件复位
Cs5460_RegDat[0]=(Config_Reg<<1) | 0x40;
Cs5460_RegDat[1]=0x00;
Cs5460_RegDat[2]=0x00;
Cs5460_RegDat[3]=0x80;
SpiX_WriteBytes(Cs5460_RegDat,4,Spi2);
delay_ms(1);
//CS5460 SPI端口初始化序列,使CS5460进入命令模式
Cs5460_RegDat[0]=0xff;
Cs5460_RegDat[1]=0xff;
Cs5460_RegDat[2]=0xff;
Cs5460_RegDat[3]=0xfe;
SpiX_WriteBytes(Cs5460_RegDat,4,Spi2);
/****** 配置寄存器 ******/
//寄存器在1:5位,所以进行移位操作;读写在第6位,读为低电平,写为高电平
Cs5460_RegDat[0]=(Config_Reg<<1) | 0x40;
//数据位:电流通道增益为10,开启高通滤波,相位为0
Cs5460_RegDat[1]=0x00;
Cs5460_RegDat[2]=0x00;
Cs5460_RegDat[3]=0x61;
if(!CS5460_Reg_IF_WRITE(Cs5460_RegDat,4))
{
//printf("写入配置寄存器产生错误\r\n");
//return ;
reg_err=1;
}
/****** 电流直流分量偏置寄存器 ******/
//寄存器在1:5位,所以进行移位操作;读写在第6位,读为低电平,写为高电平
Cs5460_RegDat[0]=(Current_DcOffeset_Reg<<1) | 0x40;
//数据位:0
Cs5460_RegDat[1]=0x00;
Cs5460_RegDat[2]=0x00;
Cs5460_RegDat[3]=0x00;
if(!CS5460_Reg_IF_WRITE(Cs5460_RegDat,4))
{
//printf("写入电流直流分量偏置寄存器产生错误\r\n");
//return ;
reg_err=1;
}
/****** 电压直流分量偏置寄存器 ******/
//寄存器在1:5位,所以进行移位操作;读写在第6位,读为低电平,写为高电平
Cs5460_RegDat[0]=(Voletage_DcOffeset_Reg<<1) | 0x40;
//数据位:0
Cs5460_RegDat[1]=0x00;
Cs5460_RegDat[2]=0x00;
Cs5460_RegDat[3]=0x00;
if(!CS5460_Reg_IF_WRITE(Cs5460_RegDat,4))
{
//printf("写入电压直流分量偏置寄存器产生错误\r\n");
//return ;
reg_err=1;
}
/****** 电流增益寄存器 ******/
//寄存器在1:5位,所以进行移位操作;读写在第6位,读为低电平,写为高电平
Cs5460_RegDat[0]=(CurrentGain_Reg<<1) | 0x40;
//数据位:0.6倍增益
Cs5460_RegDat[1]=0x26;
Cs5460_RegDat[2]=0x40;
Cs5460_RegDat[3]=0x00;
if(!CS5460_Reg_IF_WRITE(Cs5460_RegDat,4))
{
//printf("写入电流增益寄存器产生错误\r\n");
//return ;
reg_err=1;
}
/****** 电压增益寄存器 ******/
//寄存器在1:5位,所以进行移位操作;读写在第6位,读为低电平,写为高电平
Cs5460_RegDat[0]=(VoltageGain_Reg<<1) | 0x40;
//数据位:0.644倍增益
Cs5460_RegDat[1]=0x31;
Cs5460_RegDat[2]=0x38;
Cs5460_RegDat[3]=0x00;
if(!CS5460_Reg_IF_WRITE(Cs5460_RegDat,4))
{
//printf("写入电压增益寄存器产生错误\r\n");
//return ;
reg_err=1;
}
/****** 周期计数寄存器 ******/
//寄存器在1:5位,所以进行移位操作;读写在第6位,读为低电平,写为高电平
Cs5460_RegDat[0]=(CycleCount_Regg<<1) | 0x40;
//数据位:计数值4000
Cs5460_RegDat[1]=0x00;
Cs5460_RegDat[2]=0x0f;
Cs5460_RegDat[3]=0xa0;
if(!CS5460_Reg_IF_WRITE(Cs5460_RegDat,4))
{
//printf("写入周期计数寄存器产生错误\r\n");
//return ;
reg_err=1;
}
/****** 脉冲速率寄存器 ******/
//寄存器在1:5位,所以进行移位操作;读写在第6位,读为低电平,写为高电平
Cs5460_RegDat[0]=(PauleRate_Reg<<1) | 0x40;
//数据位:32000Hz
Cs5460_RegDat[1]=0x00;
Cs5460_RegDat[2]=0x7d;
Cs5460_RegDat[3]=0x00;
if(!CS5460_Reg_IF_WRITE(Cs5460_RegDat,4))
{
//printf("写入脉冲速率寄存器产生错误\r\n");
//return ;
reg_err=1;
}
/****** 时基校准寄存器 ******/
//寄存器在1:5位,所以进行移位操作;读写在第6位,读为低电平,写为高电平
Cs5460_RegDat[0]=(TimeCalib_Reg<<1) | 0x40;
//数据位:电流通道增益为10,开启高通滤波,相位为0
Cs5460_RegDat[1]=0x80;
Cs5460_RegDat[2]=0x00;
Cs5460_RegDat[3]=0x00;
if(!CS5460_Reg_IF_WRITE(Cs5460_RegDat,4))
{
//printf("写入时基校准寄存器产生错误\r\n");
//return ;
reg_err=1;
}
/****** 功率偏置寄存器 ******/
//寄存器在1:5位,所以进行移位操作;读写在第6位,读为低电平,写为高电平
Cs5460_RegDat[0]=(PowerOffset_Reg<<1) | 0x40;
//数据位:0
Cs5460_RegDat[1]=0x00;
Cs5460_RegDat[2]=0x00;
Cs5460_RegDat[3]=0x00;
if(!CS5460_Reg_IF_WRITE(Cs5460_RegDat,4))
{
//printf("写入功率偏置寄存器产生错误\r\n");
//return ;
reg_err=1;
}
/****** 电流交流分量偏置寄存器 ******/
//寄存器在1:5位,所以进行移位操作;读写在第6位,读为低电平,写为高电平
Cs5460_RegDat[0]=(Current_AcOffeset_Reg<<1) | 0x40;
//数据位:0
Cs5460_RegDat[1]=0x00;
Cs5460_RegDat[2]=0x00;
Cs5460_RegDat[3]=0x00;
if(!CS5460_Reg_IF_WRITE(Cs5460_RegDat,4))
{
//printf("写入电流交流分量偏置产生错误\r\n");
//return ;
reg_err=1;
}
/****** 电压交流分量偏置寄存器 ******/
//寄存器在1:5位,所以进行移位操作;读写在第6位,读为低电平,写为高电平
Cs5460_RegDat[0]=(Voltage_AcOffeset_Reg<<1) | 0x40;
//数据位:0
Cs5460_RegDat[1]=0x00;
Cs5460_RegDat[2]=0x00;
Cs5460_RegDat[3]=0x00;
if(!CS5460_Reg_IF_WRITE(Cs5460_RegDat,4))
{
//printf("写入电压交流分量偏置产生错误\r\n");
//return ;
reg_err=1;
}
/****** 状态寄存器 ******/
//数据位:清除所以中断标志位
CS5460_RegWrite(Status_Reg,0x00ffffff);
/****** 屏蔽寄存器 ******/
//寄存器在1:5位,所以进行移位操作;读写在第6位,读为低电平,写为高电平
Cs5460_RegDat[0]=(Mask_Reg<<1) | 0x40;
//数据位 :允许DRDY产生中断,INT端口显示状态
Cs5460_RegDat[1]=0x80;
Cs5460_RegDat[2]=0x00;
Cs5460_RegDat[3]=0x00;
if(!CS5460_Reg_IF_WRITE(Cs5460_RegDat,4))
{
//printf("写入屏蔽寄存器产生错误\r\n");
//return ;
reg_err=1;
}
//开始数据转换,连续周期转换
SpiX_WriteOneByte(0xe8,Spi2);
};
|
|