您好
我这边有个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 ();
}
你好,
硬件上,可将两个SPI接口的外设都接在一起,然后通过SPI的CS线来选中不同的设备,进行SPI通讯即可。
不同的引脚通过IO分配的方式不可行嘛,因为我这边板子已经做好了,实在不行我把他们连一起
您好
经过尝试,SPI设备能够进行不同IO的分时多用,但是有个问题,我这边是在jlink调试状态下能够正常使用,烧写到flash后,单片机无法启动,一上电就重置,感觉像是代码跑飞了,但是我在jlink调试的时候又没有问题,有调试思路吗希望给予一下
您好
问题已经解决,是我代码太大了,减少代码量就不再自动重置,我计算下来代码大概74 k,但是我的flash有128 k,不知道剩余的容量都用来干嘛了,另外我知道da14585是将代码拷贝到ram中运行的,我的实际代码量大概在多大比较合适,da14585有96 k的内存
你好,
585年的固件需要拷贝到RAM中运行,故代码大小是取决于RAM大小的,而不是FLASH。
76 kb的已经是极限了。剩余的空间是给到堆栈空间用。
关于你项目的具体空间分配,可上传你的凯尔编译后的地图文件,和你sct脚本,再作分析