实验现象:

核心代码:

  1. int main(void)
  2. {
  3. int i,n;
  4. char buffer[];
  5. char i2c_buffer[];
  6.  
  7. HAL_Init();
  8. system_clock.initialize();
  9.  
  10. led.initialize();
  11. usart1.initialize();
  12. i2c.initialize();
  13.  
  14. usart1.printf("Hello! I am iCore1S!\r\n"); //´®¿Ú1Êä³ö
  15. while()
  16. {
  17. if(usart1.receive_ok_flag)
  18. { //½ÓÊÕÍê³É
  19. usart1.receive_ok_flag = ;
  20. for(i = ;i < ;i++)
  21. {
  22. buffer[i] = tolower(usart1.receive_buffer[i]);
  23. }
  24. n = strlen(buffer);
  25. //±È½Ï½ÓÊÕÐÅÏ¢
  26. if(memcmp(buffer,"ledr",strlen("ledr")) == )
  27. {
  28. //ºìÉ«LEDµãÁÁ
  29. LED_RED_ON;
  30. LED_GREEN_OFF;
  31. LED_BLUE_OFF;
  32. }
  33. if(memcmp(buffer,"ledg",strlen("ledg")) == )
  34. {
  35. //ÂÌÉ«LEDµãÁÁ
  36. LED_RED_OFF;
  37. LED_GREEN_ON;
  38. LED_BLUE_OFF;
  39. }
  40. if(memcmp(buffer,"ledb",strlen("ledb")) == )
  41. {
  42. //À¶É«LEDµãÁÁ
  43. LED_RED_OFF;
  44. LED_GREEN_OFF;
  45. LED_BLUE_ON;
  46. }
  47. buffer[]=;//Ìí¼Ó½áÊøλ
  48. n=strlen(buffer);
  49. i2c.write_nbyte(0x03,0x8F,buffer,n); //i2c·¢ËÍÊý¾Ý
  50. for(i=;i<;i++);
  51. i2c.read_nbyte(0x03,0x0F,i2c_buffer,0x06);
  52. usart1.printf("%s\n",i2c_buffer);//´®¿Ú1Êä³ö½ÓÊÕµ½µÄÊý¾Ý
  53. }
  54. }
  55. }
  1. module I2C(
  2. input CLK_12M,
  3. input SCL,
  4. inout SDA,
  5. output FPGA_LEDR,
  6. output FPGA_LEDG,
  7. output FPGA_LEDB
  8. );
  9. //-------------------------rst_n----------------------------//
  10. reg rst_n;
  11. reg [:]cnt_rst;
  12.  
  13. always@(posedge CLK_12M)
  14. begin
  15. if(cnt_rst=='d10)
  16. begin
  17. rst_n <= 'd1;
  18. cnt_rst <= 'd10;
  19. end
  20. else cnt_rst <= cnt_rst + 'd1;
  21. end
  22.  
  23. //-------------------------parameter------------------------//
  24. parameter ledr = {'d108,8'd101,'d100,8'd114,'d13},
  25. ledg = {'d108,8'd101,'d100,8'd103,'d13},
  26. ledb = {'d108,8'd101,'d100,8'd98, 'd13},
  27. GINGKO = {'d71,8'd73,'d78,8'd71,'d75,8'd79};
  28.  
  29. //---------------------------address------------------------//
  30. reg [:]device_address,word_address;
  31. reg [:]m;
  32.  
  33. always@(posedge SCL or negedge rst_n)
  34. begin
  35. if(!rst_n)
  36. begin
  37. device_address <= 'd0;
  38. word_address <= 'd0;
  39. m <= 'd0;
  40. tx_en <= 'd0;
  41. rx_en <= 'd0;
  42. end
  43. else
  44. begin
  45. case(m)
  46. 'd0,5'd1,'d2,5'd3,'d4,5'd5,'d6,5'd7: //接收8位地址
  47. begin
  48. if(!rx_en || !tx_en)
  49. begin
  50. m <= m + 'd1;
  51. device_address <= {device_address[:],SDA};
  52. end
  53. else m <= 'd0;
  54. end
  55. 'd8:
  56. begin
  57. if(device_address=='d3 || device_address==8'd2)//识别地址
  58. begin
  59. m <= 'd9;
  60. device_address <= 'd0;
  61. end
  62. else if(tx_ack || rx_ack)//识别应答应答
  63. begin
  64. m <= 'd18;
  65. device_address <= 'd0;
  66. end
  67. else
  68. begin
  69. m <= 'd0;
  70. end
  71. end
  72. 'd9,5'd10,'d11,5'd12,'d13,5'd14,'d15,5'd16://接收命令
  73. begin
  74. m <= m + 'd1;
  75. word_address <= {word_address[:],SDA};
  76. end
  77. 'd17:
  78. begin
  79. if(word_address == 'h8f)//判断接收命令
  80. begin
  81. rx_en <= 'd1;
  82. device_address <= 'hff;
  83. word_address <= 'd0;
  84. end
  85. else if(word_address == 'h0f)//判断发送命令
  86. begin
  87. tx_en <= 'd1;
  88. word_address <= 'd0;
  89. end
  90. else if(tx_ack)
  91. begin
  92. tx_en <= 'd0;
  93. m <= 'd0;
  94. end
  95. else if(rx_ack)
  96. begin
  97. rx_en <= 'd0;
  98. m <= 'd0;
  99. end
  100. else m <= 'd17;
  101. end
  102. 'd18:
  103. begin
  104. m <= 'd0;
  105. end
  106. endcase
  107. end
  108. end
  109. //-----------------------------rx---------------------------//
  110. //接收数据
  111. reg [:]data_in;
  112. reg [:]data;
  113. reg [:]i;
  114. reg rx_en;
  115. reg rx_ack;
  116.  
  117. always@(posedge SCL or negedge rst_n)
  118. begin
  119. if(!rst_n)
  120. begin
  121. data_in <= 'd0;
  122. data <= 'd0;
  123. i <= 'd0;
  124. rx_ack <= 'd0;
  125. end
  126. else if(rx_en)
  127. begin
  128. case(i)
  129. 'd0,5'd1,'d2,5'd3,'d4,5'd5,'d6,5'd7://接收8位数据
  130. begin
  131. i <= i + 'd1;
  132. rx_ack <= 'd0;
  133. data_in <= {data_in[:],SDA};
  134. end
  135. 'd8:
  136. begin
  137. if(data_in[:]=='h0d)//判断结束为
  138. begin
  139. i <= 'd9;
  140. rx_ack <= 'd1;
  141. data <= data_in;
  142. end
  143. else i <= 'd0;
  144. end
  145. 'd9:
  146. begin
  147. i <= 'd0;
  148. rx_ack <= 'd0;
  149. end
  150. default:
  151. begin
  152. i <= 'd0;
  153. end
  154. endcase
  155. end
  156. end
  157.  
  158. //----------------------------data--------------------------//
  159. //对比接收数据
  160. reg [:]led;
  161.  
  162. always@(posedge CLK_12M or negedge rst_n)
  163. begin
  164. if(!rst_n)
  165. begin
  166. led <= 'b111;
  167. end
  168. else
  169. begin
  170. case(data[:])
  171. ledr: led <= 'b011;//红灯亮
  172. ledg: led <= 'b101;//绿灯亮
  173. ledb: led <= 'b110;//蓝灯亮
  174. default:led <= 'b111;//都不亮
  175. endcase
  176. end
  177. end
  178.  
  179. assign {FPGA_LEDR,FPGA_LEDG,FPGA_LEDB} = led;
  180.  
  181. //-----------------------------tx---------------------------//
  182. //发送数据
  183. reg [:]data_out;
  184. reg [:]j;
  185. reg [:]tx_cnt;
  186. reg tx_ack;
  187. reg tx_en;
  188. reg sda;
  189.  
  190. always@(posedge SCL or negedge rst_n)
  191. begin
  192. if(!rst_n)
  193. begin
  194. data_out <= GINGKO;
  195. j <= 'd0;
  196. tx_ack <= 'd0;
  197. tx_cnt <= 'd0;
  198. sda <= 'd1;
  199. end
  200. else
  201. begin
  202. case(j)
  203. 'd0,4'd1,'d2,4'd3,'d4,4'd5,'d6,4'd7://发送8位书籍
  204. begin
  205. if(tx_en)
  206. begin
  207. j <= j + 'd1;
  208. {sda,data_out[:]} <= data_out;
  209. tx_ack <= 'd0;
  210. end
  211. end
  212. 'd8:
  213. begin //发送6次,8位数据(GINGKO)
  214. if(tx_cnt =='d5)
  215. begin
  216. j <= j + 'd1;
  217. tx_ack <= 'd1;
  218. tx_cnt <= 'd0;
  219. end
  220. else
  221. begin
  222. j <= 'd0;
  223. tx_cnt <= tx_cnt + 'd1;
  224. tx_ack <= 'd0;
  225. end
  226. end
  227. 'd9:
  228. begin
  229. j <= 'd0;
  230. tx_ack <= 'd0;
  231. data_out <= GINGKO;
  232. end
  233. default:
  234. begin
  235. j <= 'd0;
  236. tx_ack <= 'd0;
  237. data_out <= GINGKO;
  238. end
  239. endcase
  240. end
  241. end
  242.  
  243. assign SDA = (j>='d1 && j<=4'd8)? sda : 'dz;
  244.  
  245. //--------------------------endmodule-----------------------//
  246. endmodule

实验方法及指导书:

链接:http://pan.baidu.com/s/1hs8ErAW 密码:wven

【iCore1S 双核心板_FPGA】例程十五:基于I2C的ARM与FPGA通信实验的更多相关文章

  1. 【iCore4 双核心板_FPGA】例程十四:基于I2C的ARM与FPGA通信实验

    实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符GINGKO. 3.通过串口精灵发送命令可以控制ARM·L ...

  2. 【iCore3 双核心板】例程十五:USB_CDC实验——高速数据传输

    实验指导书及代码包下载: http://pan.baidu.com/s/1gemYjz9 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  3. 【iCore4 双核心板_FPGA】例程十三:基于SPI的ARM与FPGA通信实验

    实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符HELLO. 3.通过串口精灵发送命令可以控制ARM·LE ...

  4. 【iCore1S 双核心板_FPGA】例程二:GPIO输入实验——识别按键输入

    实验现象: iCore1s 双核心板上与FPGA相连的三色LED(PCB上标示为FPGA·LED),按键按下红灯点亮,松开按键红灯熄灭. 核心源代码: module KEY( input CLK_12 ...

  5. 【iCore1S 双核心板_FPGA】例程十六:基于SPI的ARM与FPGA通信实验

    实验现象: 核心代码: int main(void) { int i,n; ]; ]; HAL_Init(); system_clock.initialize(); led.initialize(); ...

  6. 【iCore1S 双核心板_FPGA】例程五:Signal Tapll 实验——逻辑分析仪

    核心代码: //--------------------Module_Signal_TapII-------------------// module Signal_TapII( input CLK_ ...

  7. 【iCore1S 双核心板_FPGA】例程十:乘法器实验——乘法器的使用

    实验现象: 通过FPGA 的一个I/O 口连接LED:设定I/O 为输出模式.内部乘法器完成乘法计算后改变输出LED 的状态(红色LED 闪烁). 核心代码: module MULT( input C ...

  8. 【iCore1S 双核心板_FPGA】例程十二:基于单口RAM的ARM+FPGA数据存取实验

    实验现象: 核心代码: module single_port_ram( input CLK_12M, input WR, input RD, input CS0, inout [:]DB, input ...

  9. 【iCore1S 双核心板_FPGA】例程十四:FSMC总线通信实验——独立地址模式

    实验原理: STM32F103上自带FMC控制器,本实验将通过FMC总线的地址独立模式实现STM32与FPGA 之间通信,FPGA内部建立RAM块,FPGA桥接STM32和RAM块,本实验通过FSMC ...

随机推荐

  1. 命令:hash

    简介 hash命令是bash的内置命令. 我们知道在bash中执行外部命令,会根据环境变量PATH来逐一搜索命令的路径. hash就是用于记住命令的路径,并且在下次执行命令的时候直接通过hash获取而 ...

  2. saxon 处理xslt

    下载saxon : https://sourceforge.net/projects/saxon/?source=typ_redirect 下载后拿到: saxon9he.jar 运行CMD: C:\ ...

  3. grpc ssl使用

    相关链接 http://www.jianshu.com/p/2873a8349ca0

  4. BZOJ 4405 [wc2016]挑战NPC 带花树 一般图最大匹配

    https://www.lydsy.com/JudgeOnline/problem.php?id=4405 这道题大概就是考场上想不出来,想出来也调不出来的题. 把每个桶拆成三个互相有边的点,每个球向 ...

  5. [AGC025B]RGB Coloring

    [AGC025B]RGB Coloring 题目大意: 有\(n(n\le3\times10^5)\)个格子,每个格子可以选择涂成红色.蓝色.绿色或不涂色,三种颜色分别产生\(a,b,a+b(a,b\ ...

  6. 107. 二叉树的层次遍历 II

    107. 二叉树的层次遍历 II 题意 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历). 解题思路 递归:利用前序遍历的思想,在递归过程中 ...

  7. 支付宝集成遇到"_EVP_DecodeBlock",referenced from:报错

    遇到问题报错如下: 调试了好多遍,始终不行,检测各种依赖库,发现并没有少什么.后来发现支付宝demo里比文档讲解里面多两个.a文件 直接加上就好了

  8. C++有关 const & 内敛 & 友元&静态成员那些事

    C++中有关 const & 内敛 & 友元&静态成员 的用法比较杂乱,算是C++中一个麻烦的部分.现速速的对它们做大致的总结,了解它们当中常见的用法和陷阱. const修饰的 ...

  9. scrollView 刷新显示在中间的问题

    scrollView问题 打开activity之后 屏幕初始位置不是顶部 而是在中间 也就是scroll滚动条不在上面 而是在中间 楼主你好,我大概是和你遇见了同样的问题,你可以灵活处理一下,不要去管 ...

  10. 如何在本地搭建一个Android应用crashing跟踪系统-ACRA

    https://github.com/bboyfeiyu/android-tech-frontier/tree/master/others/%E5%A6%82%E4%BD%95%E5%9C%A8%E6 ...