OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5042|回复: 2

最近在做AD7606,拿安富莱V6的程序拿来改,在用keil硬件仿真时遇到以下问题,大佬们帮我看下wen

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-10-19
在线时间
18 小时
发表于 2022-4-26 18:03:23 | 显示全部楼层 |阅读模式
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;
        }
                       
               
               
               
        }




User.zip

453.07 KB, 下载次数: 13

最佳答案

查看完整内容[请看2#楼]

已解决,这个工程有点问题,硬件仿真时跑不到主函数就飞了,但工程是标准库写的移植到HAL库工作量太大,换了块有标准库例程板子,移植完修修改改调通了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-10-19
在线时间
18 小时
 楼主| 发表于 2022-4-26 18:03:24 | 显示全部楼层
已解决,这个工程有点问题,硬件仿真时跑不到主函数就飞了,但工程是标准库写的移植到HAL库工作量太大,换了块有标准库例程板子,移植完修修改改调通了。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2022-6-27
在线时间
2 小时
发表于 2022-6-27 19:44:33 | 显示全部楼层
求一份代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 15:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表