新手上路
- 积分
- 47
- 金钱
- 47
- 注册时间
- 2020-10-19
- 在线时间
- 18 小时
|
10金钱
问题如下:1、我的做法是在keil里将stm32f429bi改成stm32f429ig,然后将spi引脚修改,把串口,led,key全部注释掉,然后进行烧录,可以这样做吗?
2、在用keil进行硬件仿真时,用watch1观察采样数组,发现其每次都是同一组数,这是为什么?那我的AD到底采没采?spi到底通不通?
3、该程序应该用软件SPI还是硬件SPI?我在用硬件SPI时,发现其会卡在等待缓冲区空这个while循环里
4、哪位大佬做过stm32f429和AD7606SPI驱动这方面,能不能留个联系方式?
我把主要程序段和出问题的地方放在下面,感兴趣的留个邮箱我发完整工程
int main(void)
{
/*
由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。
*/
LED_Init();
bsp_Init();
Demo_spi_AD7606(); /* 串行AD7606演示程序 */
LED1=!LED1;
}
void Demo_spi_AD7606(void)
{
uint8_t cmd;
/*
由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。
*/
g_tAD7606.Range = 1; /* 10V */
bsp_spi_InitAD7606(); /* 配置AD7606所用的GPIO */
bsp_StartAutoTimer(0, 500); /* 启动1个500ms的自动重装的定时器 */
// DispMenu(); /* 显示操作菜单 */
while (1)
{
bsp_Idle(); /* 空闲时执行的函数,比如喂狗. 在bsp.c中 */
if (bsp_CheckTimer(0))
{
/* 每隔500ms 进来一次. 由软件启动转换 */
AD7606_Scan();
/* 处理数据 */
AD7606_Mak();
/* 打印ADC采样结果 */
// AD7606_Disp();
/*将数据存到数组里*/
AD7606_Save();
}
}
}
void AD7606_Scan(void) /* 此函数代码按照时序编写 */
{
uint8_t i;
/* BUSY = 0 时.ad7606处于空闲状态ad转换结束 */
if (BUSY_IS_LOW())
{
AD_CS_0(); /* SPI片选 = 0 */
for (i = 0; i < CH_NUM; i++)
{
s_adc_now = bsp_spiRead1();
s_adc_now = s_adc_now * 256 + bsp_spiRead1(); /* 读数据 */
}
AD_CS_1(); /* SPI片选 = 1 */
AD7606_StartConv(); /* 给开始信号 */
}
}
uint8_t bsp_spiRead1(void)
{
#ifdef SOFT_SPI /* 软件SPI */
uint8_t i;
uint8_t read = 0;
for (i = 0; i < 8; i++)
{
SCK_0();
bsp_spiDelay();
read = read<<1;
if (MISO_IS_HIGH())
{
read++;
}
SCK_1();
bsp_spiDelay();
}
return read;
#endif
#ifdef HARD_SPI /* 硬件SPI */
uint8_t read;
/* 等待发送缓冲区空 */
while(SPI_I2S_GetFlagStatus(SPI5, SPI_I2S_FLAG_TXE) == RESET);
/* 发送一个字节 */
SPI_I2S_SendData(SPI5, 0);
/* 等待数据接收完毕 */
while(SPI_I2S_GetFlagStatus(SPI5, SPI_I2S_FLAG_RXNE) == RESET);
/* 读取接收到的数据 */
read = SPI_I2S_ReceiveData(SPI5);
/* 返回读到的数据 */
return read;
#endif
void AD7606_Mak(void)
{
uint8_t i;
int16_t adc;
for (i = 0;i < CH_NUM; i++)
{
s_dat = AD7606_ReadAdc(i);
/*
32767 = 5V , 这是理论值,实际可以根据5V基准的实际值进行公式矫正
volt = ((int16_t)dat * 5000) / 32767; 计算实际电压值(近似估算的),如需准确,请进行校准
volt = dat * 0.3051850947599719
*/
adc = s_dat;
if (g_tAD7606.Range == 0)
{
s_volt = (adc * 5000) / 32767;
}
else
{
s_volt = (adc * 10000) / 32767;
}
}
}
void AD7606_Save(void)
{
if(AD7606_Counts>=0&&AD7606_Counts<=63)
{
AD7606_U1Data[AD7606_Counts]=s_volt[0];//10kV电缆母线电压数据
AD7606_U2Data[AD7606_Counts]=s_volt[1];//10kV电缆接地线电流数据
AD7606_U3Data[AD7606_Counts]=s_volt[2];//10kV电缆母线电压数据
AD7606_U4Data[AD7606_Counts]=s_volt[3];//10kV电缆接地线电流数据
AD7606_U5Data[AD7606_Counts]=s_volt[4];//10kV电缆母线电压数据
AD7606_U6Data[AD7606_Counts]=s_volt[5];//10kV电缆接地线电流数据
AD7606_U7Data[AD7606_Counts]=s_volt[6];//10kV电缆母线电压数据
AD7606_U8Data[AD7606_Counts]=s_volt[7];//10kV电缆接地线电流数据
AD7606_Counts++;
if(AD7606_Counts>=64)
AD7606_Counts=0;
}
}
|
最佳答案
查看完整内容[请看2#楼]
已解决,这个工程有点问题,硬件仿真时跑不到主函数就飞了,但工程是标准库写的移植到HAL库工作量太大,换了块有标准库例程板子,移植完修修改改调通了。
|