实验现象:

核心代码:

int main(void)
{int i,n;char buffer[20];char i2c_buffer[20];HAL_Init();system_clock.initialize();led.initialize();usart1.initialize(115200);i2c.initialize();usart1.printf("Hello! I am iCore1S!\r\n");        //´®¿Ú1Êä³öwhile(1){if(usart1.receive_ok_flag){                                           //½ÓÊÕÍê³Éusart1.receive_ok_flag = 0;for(i = 0;i < 20;i++){buffer[i] = tolower(usart1.receive_buffer[i]);}n = strlen(buffer);//±È½Ï½ÓÊÕÐÅÏ¢if(memcmp(buffer,"ledr",strlen("ledr")) == 0){//ºìÉ«LEDµãÁÁ
                    LED_RED_ON;LED_GREEN_OFF;LED_BLUE_OFF;}if(memcmp(buffer,"ledg",strlen("ledg")) == 0){//ÂÌÉ«LEDµãÁÁ
                    LED_RED_OFF;LED_GREEN_ON;LED_BLUE_OFF;}    if(memcmp(buffer,"ledb",strlen("ledb")) == 0){//À¶É«LEDµãÁÁ
                    LED_RED_OFF;LED_GREEN_OFF;LED_BLUE_ON;}    buffer[4]=13;//Ìí¼Ó½áÊøλn=strlen(buffer);i2c.write_nbyte(0x03,0x8F,buffer,n);        //i2c·¢ËÍÊý¾Ýfor(i=0;i<100;i++);i2c.read_nbyte(0x03,0x0F,i2c_buffer,0x06);usart1.printf("%s\n",i2c_buffer);//´®¿Ú1Êä³ö½ÓÊÕµ½µÄÊý¾Ý
        }}
}

module I2C(input CLK_12M,input SCL,inout SDA,output FPGA_LEDR,output FPGA_LEDG,output FPGA_LEDB
);
//-------------------------rst_n----------------------------//
    reg rst_n;reg [3:0]cnt_rst;always@(posedge CLK_12M)beginif(cnt_rst==4'd10)beginrst_n <= 1'd1;cnt_rst <= 4'd10;endelse cnt_rst <= cnt_rst + 1'd1;end//-------------------------parameter------------------------//
    parameter ledr = {8'd108,8'd101,8'd100,8'd114,8'd13},ledg = {8'd108,8'd101,8'd100,8'd103,8'd13},ledb = {8'd108,8'd101,8'd100,8'd98, 8'd13},GINGKO = {8'd71,8'd73,8'd78,8'd71,8'd75,8'd79};//---------------------------address------------------------//    reg [7:0]device_address,word_address;reg [4:0]m;always@(posedge SCL or negedge rst_n)beginif(!rst_n)begindevice_address <= 8'd0;word_address <= 8'd0;m <= 5'd0;tx_en <= 1'd0;rx_en <= 1'd0;endelse begincase(m)5'd0,5'd1,5'd2,5'd3,5'd4,5'd5,5'd6,5'd7:    //接收8位地址beginif(!rx_en || !tx_en)beginm <= m + 1'd1;device_address <= {device_address[6:0],SDA};endelse m <= 5'd0;end5'd8:beginif(device_address==8'd3 || device_address==8'd2)//识别地址beginm <= 5'd9;device_address <= 8'd0;endelse if(tx_ack || rx_ack)//识别应答应答beginm <= 5'd18;device_address <= 8'd0;endelse beginm <= 5'd0;endend5'd9,5'd10,5'd11,5'd12,5'd13,5'd14,5'd15,5'd16://接收命令beginm <= m + 1'd1;word_address <= {word_address[6:0],SDA};end5'd17:beginif(word_address == 8'h8f)//判断接收命令beginrx_en <= 1'd1;device_address <= 8'hff;word_address <= 8'd0;endelse if(word_address == 8'h0f)//判断发送命令begintx_en <= 1'd1;word_address <= 8'd0;endelse if(tx_ack)begintx_en <= 1'd0;m <= 5'd0;endelse if(rx_ack)beginrx_en <= 1'd0;m <= 5'd0;endelse m <= 5'd17;end5'd18:beginm <= 5'd0;endendcaseend            end
//-----------------------------rx---------------------------////接收数据reg [63:0]data_in;reg [63:0]data;reg [4:0]i;reg rx_en;reg rx_ack;always@(posedge SCL or negedge rst_n)beginif(!rst_n)begindata_in <= 64'd0;data <= 64'd0;i <= 5'd0;rx_ack <= 1'd0;endelse if(rx_en)begincase(i)5'd0,5'd1,5'd2,5'd3,5'd4,5'd5,5'd6,5'd7://接收8位数据begini <= i + 1'd1;rx_ack <= 1'd0;data_in <= {data_in[62:0],SDA};end5'd8:beginif(data_in[7:0]==8'h0d)//判断结束为begini <= 5'd9;rx_ack <= 1'd1;data <= data_in;endelse i <= 5'd0;end5'd9:begini <= 5'd0;rx_ack <= 1'd0;enddefault:begini <= 5'd0;endendcaseendend//----------------------------data--------------------------////对比接收数据reg [2:0]led;always@(posedge CLK_12M or negedge rst_n)beginif(!rst_n)beginled <= 3'b111;endelse begincase(data[39:0])ledr:    led <= 3'b011;//红灯亮ledg: led <= 3'b101;//绿灯亮ledb: led <= 3'b110;//蓝灯亮default:led <= 3'b111;//都不亮    endcaseendendassign {FPGA_LEDR,FPGA_LEDG,FPGA_LEDB} = led;//-----------------------------tx---------------------------////发送数据reg [47:0]data_out;reg [3:0]j;reg [2:0]tx_cnt;reg tx_ack;reg tx_en;reg sda;always@(posedge SCL or negedge rst_n)beginif(!rst_n)begindata_out <= GINGKO;j <= 4'd0;tx_ack <= 1'd0;tx_cnt <= 3'd0;sda <= 1'd1;endelse begincase(j)4'd0,4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7://发送8位书籍beginif(tx_en)beginj <= j + 1'd1;{sda,data_out[47:1]} <= data_out;tx_ack <= 1'd0;endend4'd8:begin //发送6次,8位数据(GINGKO)if(tx_cnt ==3'd5)beginj <= j + 1'd1;tx_ack <= 1'd1;tx_cnt <= 3'd0;endelsebeginj <= 4'd0;tx_cnt <= tx_cnt + 1'd1;tx_ack <= 1'd0;endend4'd9:beginj <= 4'd0;tx_ack <= 1'd0;data_out <= GINGKO;enddefault:beginj <= 4'd0;tx_ack <= 1'd0;data_out <= GINGKO;endendcaseendendassign SDA = (j>=4'd1 && j<=4'd8)? sda : 1'dz;//--------------------------endmodule-----------------------//
endmodule 

实验方法及指导书:

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

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

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

    实验现象: 核心代码: int main(void) {int i,n;char buffer[20];char spi_buffer[20];HAL_Init();system_clock.init ...

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

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

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

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

  4. 【iCore1S 双核心板_ARM】例程五:IWDG看门狗实验——复位ARM

    实验原理: STM32内部包含独立看门狗,通过看门狗可以监控程序运行,程序错误 时,未在规定时间喂狗,自动复位ARM.本实验通过按键按下,停止喂狗, 制造程序运行 错误,从而产生复位 . 实验现象: ...

  5. 【iCore1S 双核心板_ARM】例程十六:USB_MSC实验——虚拟U盘

    实验步骤: 1.将SD卡插在SD卡槽中. 2.将跳线冒跳至USB_Device,将USB_Device通过Micor USB线与USB主机(电脑)相连. 3.烧写程序,我的电脑中将出现一个磁盘. 实验 ...

  6. 【iCore1S 双核心板_ARM】例程十二:DMA实验——存储器到存储器的传输

    实验原理: DAM(直接存储器访问)传输不需要占用CPU,可以在存储器至存储器实现高速的数据 传输.本实验采用DAM2控制器的数据流0,选用通道0进行数据传输.通过LED的颜色来 判断传输是否成功. ...

  7. 【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验

    实验现象: 核心代码: int main(void) {/* USER CODE BEGIN 1 */int i;int address,data;char error_flag = 0;char r ...

  8. 【iCore4 双核心板_FPGA】例程五:基础逻辑门实验——逻辑门使用

    实验现象: 打开tool-->Netlist viewer-->RTL viewer可观察各个逻辑连接 核心代码: //--------------------module_logic_g ...

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

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

最新文章

  1. Spark源码分析之七:Task运行(一)
  2. linux命令shutdown
  3. /usr/include/boost/type_traits/detail/has_binary_operator.hp:50: Parse error at BOOST_JOIN错误
  4. C语言 | 基于MPU6050的卡尔曼滤波算法(代码类)
  5. 【CodeForces - 245C 】Game with Coins (思维,贪心)
  6. “差评”的学位论文都有哪些特点?
  7. Unity3D开发基础组件提取总结
  8. 停止运行_锅炉停止运行应注意哪些事项?
  9. java 含有package cmd_如何在命令提示符下编译运行含有Package的java文件
  10. Python 中的 if __name__ == '__main__'
  11. python3访问map
  12. ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
  13. 电源电流测试软件,如何使用分流器进行测试直流电源电流?
  14. c语言error函数的使用方法,IsError_Excel中iserror函数的使用方法
  15. 好刊邀稿:【MDPI 出版社】2区SCI,领域广,2-3个月左右录用
  16. linux socket cups,Linux打印系统CUPS原理分析
  17. zstuACM 问题 H: 超级跳跳跳1281
  18. Scrapy入门到放弃06:Spider中间件
  19. 前端开发常用PhotoShop快捷键整理(更新中)
  20. Bypass-分流抢票

热门文章

  1. 最强整理:Java开发究竟该如何学习,大厂面经合集
  2. 上海大学计算机考研资料汇总
  3. Linux项目设计:基于ARM平台的停车场管理系统制作教程
  4. linux安装自动化部署工具jenkins
  5. 游览器缓存和数据压缩
  6. 带薪“看片”?继阿里后微信也公开招聘“鉴黄师”!
  7. 前端热门工具简直不要太好用了!
  8. 【c++】1817城堡问题题解
  9. 内网穿透神器NPS的使用
  10. day01计算机基础知识Java语言基础