目录

银杏科技有限公司旗下技术文档发布平台
技术支持电话0379-69926675-801
技术支持邮件Gingko@vip.163.com
版本 日期 作者 修改内容
V1.0 2020-07-03 gingko 初次建立

实验十四:I2C实验——基于I2C的ARM与FPGA通信

一、 实验目的与意义

  1. 掌握I2C通信协议。
  2. 掌握I2C时序及使用方法。
  3. 掌握QuartusII的使用方法。

二、 实验设备及平台

  1. iCore4 双核心板点击购买
  2. Blaster(或相同功能)仿真器点击购买
  3. JLINK(或相同功能)仿真器。
  4. Micro USB线缆。
  5. Keil MDK 开发平台。
  6. Quartus开发平台。
  7. 电脑一台。

三、 实验原理

图14-1 I2C通信时序

图14-2 实验原理图

四、 代码讲解

1、在每个SCL的上升沿锁存数据并将数据拼接成完整的字节,其代码如下:

always@(posedge scl or negedge rst_n)
	if(!rst_n)
	    begin
		i <= 5'd0;
		data <= 64'd0;
		data_in <= 64'd0;
		rx_ack <= 1'd0;
	    end
	else if(rx_en)
		begin
		    case(i)
			5'd0,5'd1,5'd2,5'd3,5'd4,5'd5,5'd6,5'd7//移位完成数据接收
				begin
					i <= i + 1'd1;
					rx_ack <= 1'd0;
					data_in <= {data_in[62:0],sda};
				end
			5'd8:
				begin
					if(data_in[7:0] == 8'h0d)
						begin
							i <= 5'd9;
							rx_ack <= 1'd1;
							data <= data_in;
						end
					else
						begin
							i <= 5'd0;
						end
				end
			5'd9:begin
				rx_ack <= 1'd0;
				i <= 5'd0;
				end
			default:i <= 5'd0;
		endcase
	end	

2、在每个读命令到来时发送GINGKO,其代码如下:

always@(negedge scl or negedge rst_n)
	if(!rst_n)
	    begin
		j <= 4'd0;
		send_data <= 1'd1;
		tx_ack <= 1'd0;
		tx_cnt <= 3'd0;
		data_out <= GINGKO;
	    end
	else case(j)
		4'd0,4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7:	//移位输出数据
		    begin
			if(tx_en)
			    begin
				j <= j + 1'd1;
				{send_data,data_out[47:1]} <= data_out;
				tx_ack <= 1'd0;
				end
			    end
		4'd8:begin
			if(tx_cnt == 3'd5)		//判断最后一个字节,停止发送
			    begin
				j <= j + 1'd1;
				tx_ack <= 1'd1;
				tx_cnt <= 3'd0;
			    end
			else 
			    begin
				j <= 4'd0;
				tx_ack <= 1'd0;	
				tx_cnt <= tx_cnt + 1'd1;
				end
			    end 
		4'd9:begin
				j <= 4'd0;
				tx_ack <= 1'd0;
				data_out <= GINGKO;
			     end
		4'd10:begin
				j <= 4'd0;
				tx_ack <= 1'd0;
		      end
	endcase	

五、 实验步骤

图14-3

  1. 将硬件正确连接,如图14-3所示。
  2. 打开Commix串口精灵,找到对应的COM口打开。
  3. 打开Keil MDK开发环境,并打开实验工程。
  4. 烧写ARM程序到iCore4上。
  5. 打开QuartusII开发环境,并打开实验工程。
  6. 烧写FPGA程序到iCore4上。
  7. 输入串口命令,观察实验现象。

六、实验现象

串口命令发送格式 ARM_LED现象 FPGA_LED灯现象
LEDR\CR\LF 红灯亮 红灯亮
LEDG\CR\LF 绿灯亮 绿灯亮
LEDB\CR\LF 蓝灯亮 蓝灯亮