查看:
2052
|
回复:
12
|
求助,利用梁山派EXMC模拟8位并口8080时序数据之间不连续出现杂乱信号
|
|||
|
1#
电梯直达
最近在使用梁山派驱动一块LCD屏幕,同时也准备学习一下EXMC外设,使用的屏幕是8080驱动。于是从立创开发板提供的例程里面找到了关于16位并口的LCD驱动代码,下面是移植来的初始化代码: void exmc_gpio_init(void) { rcu_periph_clock_enable(RCU_GPIOD); rcu_periph_clock_enable(RCU_GPIOE); rcu_periph_clock_enable(RCU_GPIOG); gpio_af_set(GPIOD, GPIO_AF_12, GPIO_PIN_0|GPIO_PIN_1 |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14|GPIO_PIN_15); // EXMC功能 gpio_af_set(GPIOE, GPIO_AF_12, GPIO_PIN_7|GPIO_PIN_8 |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15); // EXMC功能 gpio_af_set(GPIOG, GPIO_AF_12, GPIO_PIN_0|GPIO_PIN_12); // EXMC功能 gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_0|GPIO_PIN_1 |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14|GPIO_PIN_15); gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_0|GPIO_PIN_1 |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14|GPIO_PIN_15); gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_7|GPIO_PIN_8 |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15); gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_7|GPIO_PIN_8 |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15); gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_0|GPIO_PIN_12); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_0|GPIO_PIN_12); } void exmc_init(void) { exmc_gpio_init(); rcu_periph_clock_enable(RCU_EXMC); exmc_norsram_parameter_struct nor_init_struct; // EXMC参数结构体 exmc_norsram_timing_parameter_struct readWriteTiming; // EXMC时间参数结构体 exmc_norsram_timing_parameter_struct writeTiming; // EXMC时间参数结构体 /* 读写时间 */ readWriteTiming.asyn_access_mode = EXMC_ACCESS_MODE_A; //模式A readWriteTiming.syn_data_latency = EXMC_DATALAT_2_CLK; readWriteTiming.syn_clk_division = EXMC_SYN_CLOCK_RATIO_2_CLK; readWriteTiming.bus_latency = 0; readWriteTiming.asyn_data_setuptime = 72; //需要360ns数据保存时间为72个HCLK =5*72=360ns readWriteTiming.asyn_address_holdtime = 0x00; //地址保持时间(ADDHLD)模式A未用到 readWriteTiming.asyn_address_setuptime = 18; //需要96ns 地址建立时间(ADDSET)为19个HCLK 1/200M=5ns*19=96ns /* 读写时间 */ writeTiming.asyn_access_mode = EXMC_ACCESS_MODE_A; //模式A writeTiming.syn_data_latency = EXMC_DATALAT_2_CLK; writeTiming.syn_clk_division = EXMC_SYN_CLOCK_RATIO_2_CLK; writeTiming.bus_latency = 0; writeTiming.asyn_data_setuptime = 4; //需要18ns数据保存时间为11个HCLK =5*4=18ns writeTiming.asyn_address_holdtime = 0x00; //地址保持时间(ADDHLD)模式A未用到 writeTiming.asyn_address_setuptime = 3; //需要18ns 地址建立时间(ADDSET)为11个HCLK 1/200M=5ns*4=18ns /* configure EXMC bus parameters */ nor_init_struct.norsram_region = EXMC_BANK0_NORSRAM_REGION3; // FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;// FSMC_Bank1_NORSRAM4;// 这里使用NE1 ,也就对应BTCR[6],[7]。 nor_init_struct.address_data_mux = DISABLE; // 不复用数据地址 nor_init_struct.memory_type = EXMC_MEMORY_TYPE_SRAM; // FSMC_MemoryType_SRAM; //SRAM nor_init_struct.databus_width = EXMC_NOR_DATABUS_WIDTH_8B; nor_init_struct.burst_mode = DISABLE; nor_init_struct.nwait_polarity = EXMC_NWAIT_POLARITY_LOW; nor_init_struct.asyn_wait = DISABLE; nor_init_struct.wrap_burst_mode = DISABLE; nor_init_struct.nwait_config = EXMC_NWAIT_CONFIG_BEFORE; nor_init_struct.memory_write = ENABLE;// 存储器写使能 nor_init_struct.nwait_signal = DISABLE; nor_init_struct.extended_mode = ENABLE; // 读写使用不同的时序 nor_init_struct.write_mode = EXMC_ASYN_WRITE; nor_init_struct.read_write_timing = &readWriteTiming;//读写时序 nor_init_struct.write_timing = &writeTiming;//写时序 exmc_norsram_init(&nor_init_struct); //初始化FSMC配置 /* enable the EXMC bank0 NORSRAM */ exmc_norsram_enable(EXMC_BANK0_NORSRAM_REGION3); // 使能BANK1 } 对例程里面的16位数据格式改成了8位数据格式,其他没变;
以上是编写的三个写入函数。并尝试发送以下数据测试波形情况发现发送的两个数据之间出现一段不规律的杂乱信号:
可以发现每一个正确数据之后总会发送一些0数据,然而运行梁山派提供的16位8080并口例程则可以正确发送,一下是梁山派例程运行结果,只抓取低8位数据验证:
向各位大佬求助,我的代码问题出在了哪里呀 |
|||
|
3#
0x6C000400和0x6C000000我也试过了结果一样
|
|||
|
5#
修改成3FE和400之后的
|
|||
|
6#
我没用到读命令
这是屏幕时序的时间约束,最小10ns我设置的18ns应该是可以的呀 |
|||
|
7#
主要是现在不看屏幕的话单独看配置好后的数据位输出,每个数据的波形也不正确呀
|
|||
|
9#
我这里为了排除其他可能原因尽可能和历程代码一模一样啦,算是只改了例程里面16位数据位那里。如果说SDRAM的影响的话例程里面不也应该是这样不正确的数据嘛
|
|||
|
11#
对呀,我直接复制过来的初始化
|
|||
|
13#
解决啦,将发送函数改成这样就好啦
|
|