实验现象:

核心代码:

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. DEDECMS后台上传banner图控制图片轮播
  2. 偷天换日,逼真的天空置换算法
  3. 世界最优秀的分布式文件系统架构演进之路
  4. mysql如何防止插入重复数据_防止MySQL重复插入数据的三种方法
  5. 2021城市大脑与智能产业趋势简报第五期
  6. python读取excel某一列内容-Python读取Excel数据并根据列名取值
  7. Redis与Memcached的比较
  8. TPC-H生成Spark测试用的伪数据集(转载)
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的网上商城
  10. python网络爬虫学习笔记(十):数据存储
  11. 专业的自建邮件服务器,自己搭建邮件服务器有哪些软硬件需求??
  12. 南阳理工计算机与科学技术,南阳理工学院计算机与信息工程学院
  13. GIS产品开源大集合
  14. AutoRunner 功能自动化测试项目实训之crm客户管理系统试用安装包下载(二十)
  15. vr全景三维产品交互展示设计
  16. JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表 - 解无邪
  17. C语言之strncpy函数
  18. 关于华为ensp一些报错处理分享及基础命令
  19. QA之道知多少(一) 初出茅庐
  20. wo de wen zhang

热门文章

  1. MySQL中的事务回滚机制
  2. 地图四染色问题——栈的回溯
  3. nrows python_python skimage图像处理(一)
  4. JAVA中的集合概念
  5. 为什么企业都在建立指标体系,有什么用途?
  6. 洛谷P4281(AHOI2008)-紧急集合(LCA)
  7. 欲借“菜篮子”生意赴美上市,叮咚买菜能解生鲜电商近渴吗?
  8. 2-wireshark网络安全分析——MAC地址泛洪攻击
  9. 接口鉴权 - 学习/实践
  10. JS报错-TypeError: xxx is not a function