新手上路 
 
	- 积分
 - 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库工作量太大,换了块有标准库例程板子,移植完修修改改调通了。 
 
 
 
 
 
 
 |