打印

STM32F407和GD32F407兼容性问题?

[复制链接]
7698|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
clf666|  楼主 | 2021-3-31 12:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
打算用GD32F407替换STM32F407,别的功能都可以正常兼容,但读取W25Q128时发现怎么也读不了数据。对比了一下SPI时序发现GD的似乎少了些东西。调试用的代码都是用同一份ST的官方库。难道STM32的SPI和GD32的SPI不完全兼容吗?

STM32时序.png (162.11 KB )

STM32时序.png

GD32时序.png (49.48 KB )

GD32时序.png

使用特权

评论回复
评论
1035178231 2021-4-26 10:45 回复TA
楼主大大,请问找到spi的问题了吗,我现在也是把stm32f407的换成gd32f407的程序,用的st的库,现在发现spi通信的网口发现有丢包的概率,有时候连续丢几包,有时候很久才丢一次,请提问一下这个问题你有了解吗?网上也有说是抗干扰能力不好,但是我用示波器测波形还是很好。 
沙发
caoenq| | 2021-4-6 08:50 | 只看该作者
是的,不完全一样。

使用特权

评论回复
板凳
renpengfly| | 2021-4-6 09:28 | 只看该作者
我客户也遇到从ST切换过来结果USB不能正常读取,找了他们FAE也没搞定,有没人遇到这个问题

使用特权

评论回复
地板
corerocky| | 2021-4-6 10:04 | 只看该作者
直接用ST官方库靠不住,就算用GD自己的库,也不保证完全没问题

使用特权

评论回复
5
clf666|  楼主 | 2021-4-6 13:13 | 只看该作者
我不知道是不是GD的硬件SPI就是这样,第一个字节总是发不出来的,无论是ST的库还是GD的库都一样,每次通信之前都要先发一个字节占坑,否则就会通信失败,有没有人遇到过跟我一样的情况的

使用特权

评论回复
6
renpengfly| | 2021-4-7 11:58 | 只看该作者
兄弟,你USB那块搞定了吗,能不能分享个demo啊

使用特权

评论回复
7
wangzhiwei999| | 2021-4-16 11:53 | 只看该作者
我也没有搞定SPI 读取M25P16  ,加上涨价厉害,也没有深入去做

使用特权

评论回复
8
cris8259| | 2021-4-18 09:57 | 只看该作者
楼主搞定了吗

使用特权

评论回复
9
cris8259| | 2021-4-18 09:58 | 只看该作者
这是我在别的地方看到的SPI兼容问题
若用户在使用时切换 SPI 配置,重配 SPI 后, SPI 时钟改变,建议在重配 SPI 之前先关闭 SPI 模块,配
置完成后,再使能 SPI。 修改代码如示例代码 2.2 所示。
SPI_Cmd(SPIx, DISABLE);
SPI_Cmd(SPIx, ENABLE);

使用特权

评论回复
评论
rosewoman 2021-5-11 12:58 回复TA
是不是初始化的时候也要先关闭SPI模块,再使能SPI?还有切换SPI配置是啥意思呢? 
10
lidi911| | 2021-4-18 15:20 | 只看该作者
不错,感谢楼主分享。

使用特权

评论回复
11
yangxiaor520| | 2021-4-19 07:23 | 只看该作者
还是有区别的

使用特权

评论回复
12
天意无罪| | 2021-4-19 08:31 | 只看该作者
目前大多数国产MCU虽然和ST的兼容性还不错,但是细微之处还是有差异的。

使用特权

评论回复
13
sfd123| | 2021-4-19 14:14 | 只看该作者
我看STM32F207和GD32F207外设地址都不一样啊

使用特权

评论回复
评论
湖南飞哥 2021-5-30 10:50 回复TA
@sfd123 :您的以太网测试 使用的 是什么PHY芯片,,我使用LAN8720,不能socket连接,,能ping通,能分享下您的代码吗? 397607437@qq.om 能发我邮箱吗? 
X1aoBa 2021-4-30 14:59 回复TA
@sfd123 :那就直接gd32f407替换stm32f207了呗,好的谢谢 
sfd123 2021-4-30 14:47 回复TA
@X1aoBa :不需要,直接就可以用,外设都是一样的 我验证了几个外设功能:串口、timer、ADC、ETH,都没问题 
X1aoBa 2021-4-26 10:25 回复TA
@sfd123 :请问gd407替换stm207的话,那么还需要更改成gd的库吗? 
sfd123 2021-4-25 13:10 回复TA
@X1aoBa :应该用GD407替换STM207,否则外设地址都不一致。我还一直在等厂家样片,还没上手! 
X1aoBa 2021-4-22 11:23 回复TA
我现在正在弄gd32f207,感觉和stm32f207差的很多,用st的库根本弄不了。现在只能改成gd的库,把底层整个换一遍,不知道老哥你是怎么弄的 
14
rosewoman| | 2021-5-11 12:48 | 只看该作者
我也是遇到SPI的问题,我用SPI2驱动液晶,驱动不成功,你们找到方法了么?

使用特权

评论回复
15
rosewoman| | 2021-5-11 12:56 | 只看该作者
clf666 发表于 2021-4-6 13:13
我不知道是不是GD的硬件SPI就是这样,第一个字节总是发不出来的,无论是ST的库还是GD的库都一样,每次通信 ...

楼主,你的每次通信的意思是啥意思呢?每次读写都要加一个字节的空指令或者数据么?

使用特权

评论回复
16
rosewoman| | 2021-5-11 14:17 | 只看该作者
楼主你们判断SPI发送完成是通过什么判断的,GD32不能通过判断SPI_I2S_FLAG_BSY标志位来判断发送完成。

使用特权

评论回复
17
鑫蕊917| | 2021-7-6 11:53 | 只看该作者
请问这是用什么软件看的时序?

使用特权

评论回复
18
QQ2224043166| | 2021-12-17 20:01 | 只看该作者
/* SPI1 init function */
#define SPI_TIME_OUT  100

void GD_SPI_Init(uint32_t spi_periph)
{
    spi_parameter_struct spi_init_struct;       
       
        if(spi_periph == SPI0)
        {               
                /* SPI parameter config */       
                spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;
                spi_init_struct.device_mode          = SPI_MASTER;
                spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;
                spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
                spi_init_struct.nss                  = SPI_NSS_SOFT;
                spi_init_struct.prescale                          = SPI_PSC_8;               
                spi_init_struct.endian               = SPI_ENDIAN_MSB;               
               
                GD_SPI_CsInit(SPI0);
                GD_SPI_MspInit(SPI0);
                spi_init(SPI0, &spi_init_struct);                       
                spi_enable(SPI0);
        }
}

void GD_SPI_MspInit(uint32_t spi_periph)
{
        if(spi_periph == SPI0)
        {
                spi_disable(SPI0);
                spi_i2s_deinit(SPI0);
                rcu_periph_clock_enable(RCU_GPIOA);
                rcu_periph_clock_enable(RCU_GPIOB);
                /**SPI0 GPIO Configuration
                PA5     ------> SPI0_SCK
                PA6     ------> SPI0_MISO
                PB5     ------> SPI0_MOSI
                */

                /* SPI0 clock enable */
                rcu_periph_clock_enable(RCU_SPI0);

                /* SPI0 GPIO config */
                gpio_af_set(GPIOB, GPIO_AF_5, GPIO_PIN_5);
                gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);
                gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);

                gpio_af_set(GPIOA, GPIO_AF_5, GPIO_PIN_5 | GPIO_PIN_6);
                gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5 | GPIO_PIN_6);
                gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6);
        }
}

void GD_SPI_MspDeInit(uint32_t spi_periph)
{
        if(spi_periph == SPI0)
        {
                spi_disable(SPI0);
                spi_i2s_deinit(SPI0);
               
                /* Peripheral clock disable */               
                rcu_periph_clock_disable(RCU_SPI0);
                /**SPI0 GPIO Configuration
                PA5     ------> SPI0_SCK
                PA6     ------> SPI0_MISO
                PB5     ------> SPI0_MOSI
                */               

                /* SPI0 GPIO config */
                gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN, GPIO_PIN_5);
                gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
               
                gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN, GPIO_PIN_5 | GPIO_PIN_6);
                gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6);               
        }
}

uint8_t SPI0_ReadWriteByte(uint8_t TxData)
{
    uint8_t retry = 0;
       
    while( spi_i2s_flag_get( SPI0, SPI_FLAG_TBE) == RESET )
    {
        retry++;
        if( retry > SPI_TIME_OUT )
        {
            return 0;
        }
    }
               
    spi_i2s_data_transmit( SPI0, TxData );
               
    retry = 0;
    while( spi_i2s_flag_get( SPI0, SPI_FLAG_RBNE) == RESET )
    {
        retry++;
        if( retry > SPI_TIME_OUT )
        {
            return 0;
        }       
    }
    return spi_i2s_data_receive( SPI0 );
}

使用特权

评论回复
19
caoenq| | 2021-12-22 09:13 | 只看该作者
corerocky 发表于 2021-4-6 10:04
直接用ST官方库靠不住,就算用GD自己的库,也不保证完全没问题

我可以负责任的告诉你,单就开发GD单片机而言,GD的库还不如ST的库

使用特权

评论回复
20
QQ2224043166| | 2021-12-30 20:32 | 只看该作者
备货GD32F407ZET6张工137 2421 2401

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝