[STM32F1] 模拟8080并行总线发送数据至FPGA

[复制链接]
2143|11
 楼主| 黎释注册 发表于 2016-12-23 15:16 | 显示全部楼层 |阅读模式
  1. #ifndef __CPU_H
  2. #define __CPU_H
  3. #include "stm32f10x.h"
  4. #include "sys.h"

  5. #define FPGA_RST     PEout(1)                  //FPGAоƬ¸´Î»¹¦ÄÜ£¬µÍµçƽÒì²½¸´Î»  1--δ¸´Î»  0--¸´Î» PE1
  6. #define FPGA_CS      PDout(0)                  //ƬѡFPGA  0--δѡÉÏ  1--Ñ¡ÉÏ  CPU_IDAT0 PD0
  7. #define FPGA_WR      PDout(3)                  //дFPGAʹÄÜ¶Ë £» 1 -дFPGA   CPU_IDAT2 PD3
  8. //#define FPGA_A       PDout(1)         //¶ÁдFPGAʱÊý¾ÝÃüÁî¿ØÖÆ×Ö  1--¶ÁдÃüÁî  0--¶ÁдÊý¾Ý CPU_IDAT1 PD1
  9. //#define FPGA_RD    PCout(11)                 //¶ÁFPGAʹÄÜ¶Ë 1-¶ÁFPGA
  10. #define FPGA_DONE    PCout(9)                  //ÊäÈë¹Ü½Å 1-FPGAÅäÖÃÍê³É  0--δÍê³É   FPGA_DONE PC9
  11. #define DATA0        PDout(5)
  12. #define DATA1        PDout(6)
  13. #define DATA2        PDout(7)
  14. #define DATA3        PDout(13)
  15. #define DATA4        PDout(14)
  16. #define DATA5        PDout(15)
  17. #define DATA6        PDout(12)
  18. #define DATA7        PCout(8)
  19. #define DATA8        PCout(10)
  20. #define DATA9        PCout(11)
  21. #define DATA10       PDout(10)
  22. #define DATA11       PDout(11)
  23. #define DATA12       PCout(6)
  24. #define DATA13       PCout(7)
  25. #define DATA14       PCout(12)
  26. #define DATA15       PDout(2)
  27. void Parallel_Init(void);
  28. void Dataout(u16 data);
  29. void write_data(u16 data);
  30. void write_data_num(u16 *str ,u16 num);
  31. #endif

  1. //******************************************************************************
  2. // [url=home.php?mod=space&uid=288409]@file[/url]    cpu.c
  3. // [url=home.php?mod=space&uid=187600]@author[/url]  wuzhicheng
  4. // [url=home.php?mod=space&uid=895143]@version[/url] V01.01
  5. // [url=home.php?mod=space&uid=212281]@date[/url]    2016Äê12ÔÂ20ÈÕ
  6. // Description : ²¢ÐÐ×ÜÏß´¦Àí.
  7. //******************************************************************************
  8. #include "stm32f10x.h"
  9. #include "cpu.h"
  10. #include "delay.h"
  11. //#define set_in()  {GPIOD->CRL=0X88888888;GPIOD->ODR=0XFFFF;}//PD0-7  ÉÏÀ­ÊäÈë  //È«²¿Êä³ö¸ß
  12. //#define set_out() {GPIOD->CRL=0X33333333;GPIOD->ODR=0XFFFF;
  13. //                   GPIOD->CRL=0X33333333;GPIOD->ODR=0XFFFF;}//PD0-7  ÉÏÀ­Êä³ö  //È«²¿Êä³ö¸ß
  14. // ******************************************************************************
  15. // º¯ÊýÃû£º    void Parallel_Init(void)
  16. // ¹¦ÄÜÃèÊö£º  ½Ó¿Ú³õʼ»¯
  17. // ÊäÈë²ÎÊý£º  ÎÞ
  18. // ±»µ÷Óú¯Êý£ºÎÞ
  19. //  ******************************************************************************
  20. void Parallel_Init(void)
  21. {         
  22.         RCC->APB2ENR|=1<<4;          //PORTCʱÖÓʹÄÜ PC6,7,8,10,11,12 6GE;  PC9        
  23.   RCC->APB2ENR|=1<<5;          //PORTDʱÖÓʹÄÜ PD2,5,6,7,10,11,12,13,14,15  10GE  PD0 PD3
  24.   RCC->APB2ENR|=1<<6;   //PORTEʱÖÓʹÄÜ PE1£¬
  25.         GPIOC->CRL&=0X33000000;  //ͨÓÃÍÆÍìÊä³öģʽ£PPC6 PC7
  26.         GPIOC->CRH&=0X00033383;  //ͨÓÃÍÆÍìÊä³öģʽ£PPC8 PC10 PC11 PC12£¬PC9ÉèÖÃΪÉÏÀ­/ÏÂÀ­ÊäÈë-1000£»
  27.         GPIOC->ODR|=0XFFFF;      //È«²¿ÉèÖÃΪÊä³ö¸ßµçƽ£»
  28.         //GPIOC->ODR|=0X1DC0;           //0001_1101_1100_0000

  29.         GPIOD->CRL&=0X33303303; //ͨÓÃÍÆÍìÊä³öģʽ£PPD0 PD2 PD3 PD5 PD6 PD7
  30.         GPIOD->CRH&=0X33333300; //ͨÓÃÍÆÍìÊä³öģʽ£PPD10 PD11 PD12 PD13  PD14 PD15
  31.         GPIOD->ODR|=0XFFFF;           //È«²¿ÉèÖÃΪÊä³ö¸ßµçƽ
  32.   //GPIOD->ODR|=0XFCE4;       //1111_1100_1110_0100
  33.         GPIOE->CRL&=0X00000030;//ÉèÖÃPE1ΪͨÓÃÍÆÍìÊä³öģʽ -0011
  34. }
  35. // ******************************************************************************
  36. //  º¯ÊýÃû      void Dataout(u16 data)
  37. //  ¹¦ÄÜÃèÊö    Êý¾ÝÊä³ö
  38. //  ÊäÈë²ÎÊý    data ÒªÊäÈëµÄÊý¾Ý
  39. //  ÏȾöÌõ¼þ        IO¿Ú±ØÐèÏÈÉèÖÃΪÊä³ö¿Ú
  40. //  ±»µ÷Óú¯Êý        ÎÞ
  41. // ******************************************************************************

  42. void Dataout(u16 data)
  43. {
  44.         DATA0 = data>>15;
  45.         DATA1 = data>>14;
  46.         DATA2 = data>>13;
  47.         DATA3 = data>>12;
  48.         DATA4 = data>>11;
  49.         DATA5 = data>>10;
  50.         DATA6 = data>>9;
  51.         DATA7 = data>>8;
  52.         DATA8 = data>>7;
  53.         DATA9 = data>>6;
  54.         DATA10 = data>>5;
  55.         DATA11 = data>>4;
  56.         DATA12 = data>>3;
  57.         DATA13 = data>>2;
  58.         DATA14 = data>>1;
  59.         DATA15 = data;
  60. //GPIOC->ODR=(GPIOC->ODR&0xe23f)|data;   //GPIOC->ODR&0XE23F;  1110_0010_0011_1111
  61. //GPIOD->ODR=(GPIOD->ODR&0x031b)|data;   //GPIOD->ODR&0x1dc0   0000_0011_0001_1011
  62. }
  63. // ******************************************************************************
  64. // º¯ÊýÃû       void write_data(u16 data)
  65. // ¹¦ÄÜÃèÊö     Ð´Êý¾Ý
  66. // ÊäÈë²ÎÊý     data 16λÊý¾Ý
  67. // ±»µ÷Óú¯Êý          Dataout(data);
  68. // ******************************************************************************
  69. void write_data(u16 data)
  70. {
  71.         FPGA_CS = 1;
  72.         delay_us(1);
  73.         FPGA_WR = 0;
  74.         delay_us(1);
  75.   Dataout(data);
  76.         delay_us(1);
  77.   FPGA_WR=1;
  78.         delay_us(5);
  79.   FPGA_WR=0;
  80.         delay_us(5);
  81.         FPGA_CS = 0;
  82. }
  83. //*******************************************************************************
  84. // º¯ÊýÃû:      void write_data_num(u16 *str,u16 num)
  85. // ¹¦ÄÜÃèÊö:    дÈëÖ¸µã³¤¶ÈµÄÊý¾Ý
  86. // ÊäÈë²ÎÊý:    *str 16λÊý¾Ý×é; u16 Êý¾Ý¸öÊý£»
  87. // ±»µ÷Óú¯Êý          write_data( u16 data);
  88. //*******************************************************************************
  89. void write_data_num(u16 *str ,u16 num)
  90. {
  91.         u16 i=0;
  92.         for(i=0;i<num;i++)
  93.         {
  94.                 write_data(str[i]);
  95.                 delay_us(100);
  96.         }
  97. }
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "cpu.h"
  4. //#include "w25qxx.h"
  5. //******************************************************************************
  6. //º¯ÊýÃû£º    int main(void)
  7. //¹¦ÄÜÃèÊö£º  Ö÷º¯Êý£¬Ä£Äâ8080²¢ÐÐ×ÜÏߣ¬·¢ËÍÊý¾Ýµ½FPGA
  8. //ÊäÈë²ÎÊý£º  ÎÞ
  9. //±»µ÷Óú¯Êý£ºÎÞ
  10. //******************************************************************************       
  11. //ҪдÈëµ½W25Q128µÄ×Ö·û´®Êý×é
  12. //u16 spi_Buffer[2048];
  13. //#define SIZE sizeof (spi_Buffer)
  14. int main(void)
  15. {       
  16.   //u16 datatemp[SIZE];
  17.         u16 spi_Buffer[2048];
  18.         u16 i;
  19.         u16 num = 2048;
  20.         //u32 wraddr = 0;
  21.         Stm32_Clock_Init(9);        //ϵͳʱÖÓÉèÖÃ
  22.         delay_init(72);                            //ÑÓʱ³õʼ»¯                          
  23.         //W25QXX_Init();                        //W25QXX³õʼ»¯
  24.         Parallel_Init();     //²¢¿Ú³õʼ»¯;
  25.         for(i=0; i<num; i++) //²úÉúÊý×é;
  26.         {
  27.            spi_Buffer[i]=i;
  28.         }
  29.   //W25QXX_Write((u16*)spi_Buffer,wraddr,SIZE);
  30.   //delay_ms(500);
  31.   //W25QXX_Read(datatemp,wraddr,SIZE);                                        //¶Á³öSIZE¸ö×Ö½Ú
  32.   //delay_ms(500);
  33.         FPGA_RST = 0;
  34.         delay_ms(500);
  35.         FPGA_RST = 1;
  36.         delay_ms(500);
  37.         delay_ms(500);
  38.   write_data_num(spi_Buffer,num); //Êý¾Ý¾­²¢¿Ú·¢Ë͵½FPGA
  39.         delay_ms(500);
  40. }
这是我编写的部分代码,(1.CPU.H  ;   2. CPU.C  ;  3 .TEST.C ;)大致意思是将16位并行数据发送至fpga,模拟的是8080并行口,但是没有读的部分,也没有地址,在FPGA部分设置双口RAM缓存数据,考虑到是按顺序存储,就自加产生写地址;FPGA部分编写完成,功能仿真也可以,但是好像数据没有发送过去,不知问题出在哪儿,STM32刚学习不久,所以怀疑这边出现问题,希望大家可以帮我看看。多多指点!万分感谢!
(本来还有一部分读写W25Q16部分,因为数据是先缓冲到那里面,但是考虑到一步一步调试,所以先注销了,后面再研究)
 楼主| 黎释注册 发表于 2016-12-23 15:17 | 显示全部楼层
乱码部分都是注释,对整个代码没有影响,要是感兴趣可以复制带文档中看下,诚心请教。谢谢!
mmuuss586 发表于 2016-12-23 17:47 | 显示全部楼层
本帖最后由 mmuuss586 于 2016-12-23 17:56 编辑

用FSMC总线就可以了;
就像读写RAM一样;

写的部分看了下,没有问题;

控制地址就和控制输出数据一样;当然写完或读完后,最好将所有地址线都拉高或拉低;

读的话,控制下RD高低电平信号就可以了;

和你FPGA类似的;

你这样做效率很低,和FPGA通讯还不如SPI接口呢;
稳稳の幸福 发表于 2016-12-23 18:24 | 显示全部楼层
给力,这种都可以模拟,FPGA要求很高的。
 楼主| 黎释注册 发表于 2016-12-24 12:57 | 显示全部楼层
mmuuss586 发表于 2016-12-23 17:47
用FSMC总线就可以了;
就像读写RAM一样;

谢谢,因为硬件上没有用到FSMC管脚,硬件设计好了,这就没办法了,还好不是一直传数据,开机的时候就发送一次过去就好了。而且没有用到读数据,所以就不需要控制RD,
。。。。。。。。。。。
但是,没什么测试的时候,没有得到预期效果,不知道问题出在哪儿了,所以首先检查STM32这边是否出现问题。希望能给点建议。谢谢!
 楼主| 黎释注册 发表于 2016-12-24 12:57 | 显示全部楼层
mmuuss586 发表于 2016-12-23 17:47
用FSMC总线就可以了;
就像读写RAM一样;

谢谢,因为硬件上没有用到FSMC管脚,硬件设计好了,这就没办法了,还好不是一直传数据,开机的时候就发送一次过去就好了。而且没有用到读数据,所以就不需要控制RD,
。。。。。。。。。。。
但是,没什么测试的时候,没有得到预期效果,不知道问题出在哪儿了,所以首先检查STM32这边是否出现问题。希望能给点建议。谢谢!
 楼主| 黎释注册 发表于 2016-12-24 12:58 | 显示全部楼层
稳稳の幸福 发表于 2016-12-23 18:24
给力,这种都可以模拟,FPGA要求很高的。

可能是刚接触到STM32,感觉用着没有FPGA自由,
皈依 发表于 2016-12-24 13:38 | 显示全部楼层
可以的~
稳稳の幸福 发表于 2016-12-25 15:21 | 显示全部楼层
黎释注册 发表于 2016-12-24 12:58
可能是刚接触到STM32,感觉用着没有FPGA自由,

哈哈,看来你是一直用FPGA啊,我一次没用过,仅仅学过一点,等习惯了你会发现单片机比FPGA好用,成本低
Varus 发表于 2016-12-25 16:04 | 显示全部楼层
用SPI接口和FPGA通讯不行?
 楼主| 黎释注册 发表于 2016-12-26 08:42 | 显示全部楼层
Varus 发表于 2016-12-25 16:04
用SPI接口和FPGA通讯不行?

当然可以,但是这边硬件已经设计好了,没有用到SPI,而且是16位并行数据
Soraka 发表于 2016-12-29 21:47 | 显示全部楼层
控制地址就和控制输出数据一样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

37

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部