GD32E507系列SPI读写

main.c

int main(void)
{
    int32_t addr0;              //spi读取的数据
    int32_t data = 0xffffffff;  //spi写入数据
	
    for( ;; )
    {
		Reg_Write_0(uint32_t data)
		addr = Reg_Read();
		
		printf("spi1 is %d , %x",addr,addr);

		vTaskDelay(1000);
	}
}

查询芯片的数据手册,查看spi0的引脚

(1)本次使用的是SPI0读取某个芯片的地址,spi.c

#include "bsp_spi.h"


void SPI0_Init(void)                                                             //SPI0
{
    spi_parameter_struct spi_init_struct;

    rcu_periph_clock_enable(RCU_GPIOA);
	rcu_periph_clock_enable(RCU_GPIOE);
	rcu_periph_clock_enable(RCU_AF);
    rcu_periph_clock_enable(RCU_SPI0);

    /* SPI0_SCK(PA5), SPI0_MISO(PA6) and SPI0_MOSI(PA7) GPIO pin configuration */
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7);
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
    /* SPI0_CS(PA4) GPIO pin configuration */
    gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
	
    /* chip select invalid*/
    SPI0_CS_HIGH();

    /* SPI0 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_2EDGE;
    spi_init_struct.nss                  = SPI_NSS_SOFT;
    spi_init_struct.prescale             = SPI_PSC_64;
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
    spi_init(SPI0, &spi_init_struct);

    /* enable SPI0 */
    spi_enable(SPI0);
    
}

uint32_t Reg_Read_0(uint8_t addr)
{
    uint8_t a,b,c;
    uint32_t reg_data;

    SPI0_CS_LOW();
    spi0_flash_send_byte(addr);
    a = spi0_flash_read_byte();
    b = spi0_flash_read_byte();
    c = spi0_flash_read_byte();

    reg_data = (a << 16) | (b << 8) | c;
    SPI0_CS_HIGH();
    
    return reg_data;
}

void Reg_Write_0(uint32_t data)
{
    SPI0_CS_LOW();
    spi0_flash_send_byte((uint8_t)((data >> 24) & 0xFF));
    spi0_flash_send_byte((uint8_t)((data >> 16) & 0xFF));
    spi0_flash_send_byte((uint8_t)((data >> 8) & 0xFF));
    spi0_flash_send_byte((uint8_t)(data & 0xFF));
    SPI0_CS_HIGH();
}

uint8_t spi0_flash_send_byte(uint8_t byte)
{
    /* loop while data register in not emplty */
    while (RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_TBE));

    /* send byte through the SPI0 peripheral */
    spi_i2s_data_transmit(SPI0,byte);

    /* wait to receive a byte */
    while(RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_RBNE));

    /* return the byte read from the SPI bus */
    return(spi_i2s_data_receive(SPI0));
}

uint8_t spi0_flash_read_byte(void)
{
    return(spi0_flash_send_byte(0xA5));
}

(3)spi.h

#ifndef __BSP_SPI_H_
#define __BSP_SPI_H_


#include "bsp.h"

#define  SPI0_CS_LOW()        gpio_bit_reset(GPIOA, GPIO_PIN_4)                 
#define  SPI0_CS_HIGH()       gpio_bit_set(GPIOA, GPIO_PIN_4)

uint32_t Reg_Read_0(uint8_t addr);
void Reg_Write_0(uint32_t data);
uint8_t spi0_flash_send_byte(uint8_t byte);
uint8_t spi0_flash_read_byte(void);

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据引用\[1\],GD32E507的时钟树中使用了HCLK作为主时钟信号。在取数据时,为了保证数据的准确性,会延迟一定的HCLK周期后再进行采样。此外,还可以使用内部可调时钟来微调HCLK,以提高数据的准确性。取的数据在进入AHB总线之前会先存储在异步FIFO中,命令过程中会添加2-3个HCLK的延迟。 根据引用\[2\],在初始化SDRAM的时序寄存器时,需要设置不同的时序参数。这些参数包括模式寄存器加载延迟、自刷新模式退出延迟、行地址选通延迟、自刷新延迟、恢复延迟、行预充电延迟和行到列延迟。具体的设置需要参考对应SDRAM芯片数据手册的说明,不同厂商对同一种时序的命名可能不同。如果找不到相应的说明,可以参考兆易创新官方的例程或者将数值设得稍大一些。 根据引用\[3\],在初始化SDRAM时,需要设置一些参数。其中包括保护使能、时钟频率选择、突发切换使能、管道延迟和时序初始化结构体的填。时钟频率选择时,一般选择HCLK的二分频,并且不能超过SDRAM的最高工作频率。管道延迟一般设置为2个HCLK周期。时序初始化结构体的填需要根据具体的时序要求进行设置。 综上所述,GD32E507的时钟树需要根据具体的需求和SDRAM芯片的要求进行设置和初始化。 #### 引用[.reference_title] - *1* *2* *3* [【GD32】从零开始学GD32单片机高级篇——外部存储器控制器EXMC详解+SDRAM例程](https://blog.csdn.net/JackieCoo/article/details/129135616)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值