6个员额/ 0个新员额
最后发表
liufeng-blue
离线
最后看到:1年5天前
加入:2018-07-02 06:44
关于对SPI进行分时复用

您好

我这边有个SPI屏幕,同时有时候还要操作SPI_FLASH, da14585的硬件SPI资源只有一路,如果对该路SPI进行分时复用,一下是我经过尝试失败后的代码,希望予以解决,思路大概是在操作flash的时候将SPI分配给flash,然后进行读写操作,再将SPI分配给屏幕,进行显示刷新

Void uint8_data_from_flash (uint8_t* ptr, uint8_t size)

GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_CS_PIN, OUTPUT, PID_SPI_EN, true);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_CLK_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_DO_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_DI_PIN, INPUT, PID_SPI_DI, true);

spi_flash_enable (SPI_EN_GPIO_PORT SPI_EN_GPIO_PIN);

spi_flash_init (SPI_FLASH_DEFAULT_SIZE SPI_FLASH_DEFAULT_PAGE);

/ /保存数据
spi_flash_read_data (ptr、SPI_SAVE_BLOCK、大小);

//关闭SPI Flash
spi_flash_power_down ();

GPIO_ConfigurePin(OLED_DC_PORT, OLED_DC_PIN, OUTPUT, PID_GPIO, true);
GPIO_ConfigurePin(OLED_RES_PORT, OLED_RES_PIN, OUTPUT, PID_GPIO, true);
GPIO_ConfigurePin(OLED_DIN_PORT, OLED_DIN_PIN, OUTPUT, PID_SPI_DO, true);
GPIO_ConfigurePin(OLED_CLK_PORT, OLED_CLK_PIN, OUTPUT, PID_SPI_CLK, true);
spi_init (&spi_driver_cs_pad、SPI_MODE_8BIT SPI_ROLE_MASTER、SPI_CLK_IDLE_POL_HIGH SPI_PHA_MODE_0, SPI_MINT_ENABLE, SPI_XTAL_DIV_2);
spi_flash_release_from_power_down ();

(uint8_t* ptr, uint8_t size)

GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_CS_PIN, OUTPUT, PID_SPI_EN, true);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_CLK_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_DO_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_DI_PIN, INPUT, PID_SPI_DI, true);

spi_flash_enable (SPI_EN_GPIO_PORT SPI_EN_GPIO_PIN);

spi_flash_init (SPI_FLASH_DEFAULT_SIZE SPI_FLASH_DEFAULT_PAGE);

/ /保存数据
spi_flash_block_erase (SPI_SAVE_BLOCK SECTOR_ERASE);
spi_flash_write_data (ptr、SPI_SAVE_BLOCK、大小);

//关闭SPI Flash
spi_flash_power_down ();

GPIO_ConfigurePin(OLED_DC_PORT, OLED_DC_PIN, OUTPUT, PID_GPIO, true);
GPIO_ConfigurePin(OLED_RES_PORT, OLED_RES_PIN, OUTPUT, PID_GPIO, true);
GPIO_ConfigurePin(OLED_DIN_PORT, OLED_DIN_PIN, OUTPUT, PID_SPI_DO, true);
GPIO_ConfigurePin(OLED_CLK_PORT, OLED_CLK_PIN, OUTPUT, PID_SPI_CLK, true);
spi_init (&spi_driver_cs_pad、SPI_MODE_8BIT SPI_ROLE_MASTER、SPI_CLK_IDLE_POL_HIGH SPI_PHA_MODE_0, SPI_MINT_ENABLE, SPI_XTAL_DIV_2);
spi_flash_release_from_power_down ();

设备:
CYibin
离线
最后看到:9个月2个星期前
工作人员
加入:2017-12-14 02:48
你好,

你好,

硬件上,可将两个SPI接口的外设都接在一起,然后通过SPI的CS线来选中不同的设备,进行SPI通讯即可。

liufeng-blue
离线
最后看到:1年5天前
加入:2018-07-02 06:44
不同的引脚通过IO分配的方式不可行嘛

不同的引脚通过IO分配的方式不可行嘛,因为我这边板子已经做好了,实在不行我把他们连一起

liufeng-blue
离线
最后看到:1年5天前
加入:2018-07-02 06:44
您好

您好

经过尝试,SPI设备能够进行不同IO的分时多用,但是有个问题,我这边是在jlink调试状态下能够正常使用,烧写到flash后,单片机无法启动,一上电就重置,感觉像是代码跑飞了,但是我在jlink调试的时候又没有问题,有调试思路吗希望给予一下

liufeng-blue
离线
最后看到:1年5天前
加入:2018-07-02 06:44
您好

您好

问题已经解决,是我代码太大了,减少代码量就不再自动重置,我计算下来代码大概74 k,但是我的flash有128 k,不知道剩余的容量都用来干嘛了,另外我知道da14585是将代码拷贝到ram中运行的,我的实际代码量大概在多大比较合适,da14585有96 k的内存

CYibin
离线
最后看到:9个月2个星期前
工作人员
加入:2017-12-14 02:48
你好,

你好,

585年的固件需要拷贝到RAM中运行,故代码大小是取决于RAM大小的,而不是FLASH。

76 kb的已经是极限了。剩余的空间是给到堆栈空间用。

关于你项目的具体空间分配,可上传你的凯尔编译后的地图文件,和你sct脚本,再作分析