实验现象:

1、先烧写ARM程序,然后烧写FPGA程序。

2、打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符GINGKO。

3、通过串口精灵发送命令可以控制ARM·LED和FPGA·LED。

命令格式
LEDR\CR\LF ARM·LED、FPGA·LED亮
LEDG\CR\LF ARM·LED、FPGA·LED亮
LEDB\CR\LF ARM·LED、FPGA·LED亮

核心代码:

int main(void)
{ /* USER CODE BEGIN 1 */
int i;
char buffer[];
char i2c_buffer[];
/* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */
SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART6_UART_Init(); /* USER CODE BEGIN 2 */
i2c.initialize();
usart6.initialize();
usart6.printf("Hello,I am iCore4!\r\n");
LED_GREEN_ON; /* USER CODE END 2 */ /* Infinite loop */
/* USER CODE BEGIN WHILE */
while ()
{
/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */
if(usart6.receive_ok_flag == ){
usart6.receive_ok_flag = ;
for(i = ;i < ;i ++){
buffer[i] = tolower(usart6.receive_buffer[i]);
}
if(memcmp(buffer,"ledr",strlen("ledr")) == ){ //±È½Ï½ÓÊÕÊý¾Ý
LED_RED_ON;
LED_GREEN_OFF;
LED_BLUE_OFF;
i2c.write_nbyte(0x03,0X8F,buffer,strlen(buffer)); //i2c×ÜÏß·¢ËÍÊý¾Ý
}
if(memcmp(buffer,"ledg",strlen("ledg")) == ){
LED_RED_OFF;
LED_GREEN_ON;
LED_BLUE_OFF;
i2c.write_nbyte(0x03,0X8F,buffer,strlen(buffer));
}
if(memcmp(buffer,"ledb",strlen("ledb")) == ){
LED_RED_OFF;
LED_GREEN_OFF;
LED_BLUE_ON;
i2c.write_nbyte(0x03,0X8F,buffer,strlen(buffer));
}
for(i = ; i < ; i ++);
i2c.read_nbyte(0x02,0x0F,i2c_buffer,0x06); //i2c×ÜÏß½ÓÊÕÊý¾Ý
usart6.printf(i2c_buffer);
}
}
/* USER CODE END 3 */ }
module i2c_ctrl(
input clk_25m,
input rst_n,
input scl,
inout sda,
output led_red,
output led_green,
output led_blue
); //---------------------------parameter--------------------------//
parameter ledr = {'d108,8'd101,'d100,8'd114,'d13},
ledg = {'d108,8'd101,'d100,8'd103,'d13},
ledb = {'d108,8'd101,'d100,8'd98,'d13},
GINGKO = {'d71,8'd73,'d78,8'd71,'d75,8'd79},
wide = 'd40; //-----------------------------address--------------------------//
reg[:]m;
reg[:]device_address,word_address; //接收地址先传输高位 always@(posedge scl or negedge rst_n)
if(!rst_n)
begin
m <= 'd0;
device_address <= 'd0;
word_address <= 'd0;
tx_en <= 'd0;
tx_en <= 'd0;
end
else case(m)
'd0,5'd1,'d2,5'd3,'d4,5'd5,'d6,5'd7: //接收设备地址
begin
if(!rx_en || !tx_en)
begin
m <= m + 'd1;
device_address <= {device_address[:],sda};
end
else m <= 'd0;
end
'd8:
begin
if(device_address == 'd3 || device_address == 8'd2)
begin
m <= 'd9;
device_address <= 'd0;
end
else if(rx_ack || tx_ack)
begin
m <= 'd18;
device_address <= 'd0;
end
else
begin
m <= 'd0;
end
end
'd9,5'd10,'d11,5'd12,'d13,5'd14,'d15,5'd16: //接收寄存器地址,以寄存器地址区分读写操作
begin
m <= m + 'd1;
word_address <= {word_address[:],sda};
end
'd17:
begin
if(word_address == 'h8f) //使能接收数据
begin
rx_en <= 'd1;
word_address <= 'd0;
end
else if(word_address == 'h0f) //使能发送数据
begin
tx_en <= 'd1;
word_address <= 'd0;
end
else if(rx_ack)
begin
rx_en <= 'd0;
m <= 'd0;
end
else if(tx_ack)
begin
tx_en <= 'd0;
m <= 'd18;
end
else m <= 'd17;
end
'd18:begin
m <= 'd0;
end
endcase //-------------------------------rx---------------------------//
/*接收数据*/
reg[:]data_in;
reg[:]data;
reg[:]i;
reg tx_en,rx_en;
reg rx_ack; always@(posedge scl or negedge rst_n)
if(!rst_n)
begin
i <= 'd0;
data <= 'd0;
data_in <= 'd0;
rx_ack <= 'd0;
end
else if(rx_en)
begin
case(i)
'd0,5'd1,'d2,5'd3,'d4,5'd5,'d6,5'd7: //移位完成数据接收
begin
i <= i + 'd1;
rx_ack <= 'd0;
data_in <= {data_in[:],sda};
end
'd8:
begin
if(data_in[:] == 'h0d)
begin
i <= 'd9;
rx_ack <= 'd1;
data <= data_in;
end
else
begin
i <= 'd0;
end
end
'd9:begin
rx_ack <= 'd0;
i <= 'd0;
end
default:i <= 'd0;
endcase
end //-----------------------------data-------------------------//
/*比较接收数据*/
reg [:]led;
always@(posedge clk_25m or negedge rst_n)
if(!rst_n)
begin
led <= 'b101;
end
else if (data[wide-:] == ledr)
led <= 'b011;
else if (data[wide-:] == ledg)
led <= 'b101;
else if (data[wide-:] == ledb)
led <= 'b110; assign {led_red,led_green,led_blue} = led; //----------------------------tx--------------------------// //发送数据 先传输高位
reg[:]data_out;
reg[:]j;
reg send_data;
reg tx_ack;
reg[:]tx_cnt;
always@(negedge scl or negedge rst_n)
if(!rst_n)
begin
j <= 'd0;
send_data <= 'd1;
tx_ack <= 'd0;
tx_cnt <= 'd0;
data_out <= GINGKO;
end
else case(j)
'd0,4'd1,'d2,4'd3,'d4,4'd5,'d6,4'd7: //移位输出数据
begin
if(tx_en)
begin
j <= j + 'd1;
{send_data,data_out[:]} <= data_out;
tx_ack <= 'd0;
end
end
'd8:begin
if(tx_cnt == 'd5) //判断最后一个字节,停止发送
begin
j <= j + 'd1;
tx_ack <= 'd1;
tx_cnt <= 'd0;
end
else
begin
j <= 'd0;
tx_ack <= 'd0;
tx_cnt <= tx_cnt + 'd1;
end
end
'd9:begin
j <= 'd0;
tx_ack <= 'd0;
data_out <= GINGKO;
end
'd10:begin
j <= 'd0;
tx_ack <= 'd0;
end
endcase assign sda = (j >= 'd1 && j <= 4'd8) ? send_data : 'dz; endmodule

源代码下载链接:

链接:http://pan.baidu.com/s/1geWgggF 密码:an3s

iCore4链接:

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

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

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

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

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

  3. 【iCore3 双核心板】例程十四:FATFS实验——文件操作

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

  4. 【iCore4 双核心板_FPGA】例程四:Signal Tapll 实验——逻辑分析仪

    实验现象: 三色led轮流闪烁,具体的逻辑分析仪使用教程请参考iCore3逻辑分析仪例程 核心代码: module signal_ctrl( input clk_25m, input rst_n, o ...

  5. 【iCore4 双核心板_FPGA】例程十:FSMC总线通信实验——复用地址模式

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

  6. 【iCore4 双核心板_FPGA】例程十二:基于UART的ARM与FPGA通信实验

    实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,会接收到字符GINGKO. 3.通过串口精灵发送命令可以控制ARM·LED和FPGA·LED. 核心代码: int main ...

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

    实验现象: 写RAM命令格式:write:地址(0-255),数据(0-65535)\cr\lf 读RAM命令格式:read:地址(0-255)\cr\lf 核心代码: int main(void) ...

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

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

  9. 【iCore4 双核心板_FPGA】例程八:乘法器实验——乘法器使用

    实验现象: 程序运行时,绿色led闪烁(目前,具体的乘法器调用请参考iCore3乘法器例程) 核心代码: module multiplier_ctrl( input clk_25m, input rs ...

随机推荐

  1. SQL RAISERROR 用法

    ) ), YOUR UNIQUEIDENTIFIER KEY) ,, @raiseErrorCode) RAISERROR ( N'This is message %s %d.', -- Messag ...

  2. redis清除缓存和连接远程服务器

    直接进入命令行输入 1.连接远程redis:   redis-cli -h 127.0.0.1 -p 3008 -a pIctur3   (a后是密码) 2.查看缓存:keys * 3.清除缓存:de ...

  3. db2存储过程动态sql被截断

    编写存储过程,使用动态sql时,调试时发现变量赋值后被截断. 关键代码如下: 实现的效果是先把上下游做对比的sql语句和相关参数存入RKDM_DATA_VOID_RULE, 执行存储过程后把两个sql ...

  4. PID控制器(比例-积分-微分控制器)- IV

    调节/测量放大电路电路图:PID控制电路图 如图是PlD控制电路,即比例(P).积分(I).微分(D)控制电路. A1构成的比例电路与环路增益有关,调节RP1,可使反相器的增益在0·5一∞范围内变化; ...

  5. 亲测GO环境搭建,理解go build、go install、go get

    GO下载: GO语言中文网下载:https://studygolang.com/dl Mac下直接通过brew instatll go指令即可完成下载安装 GO环境变量配置: $GOROOT=/usr ...

  6. 将远程git仓库里的指定分支拉取到本地(本地不存在的分支

    将远程git仓库里的指定分支拉取到本地(本地不存在的分支) https://www.cnblogs.com/hamsterPP/p/6810831.html

  7. verilog语法实例学习(13)

    verilog代码编写指南 变量及信号命名规范  1. 系统级信号的命名.  系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号:系统信号以字符串Sys开头.  2. 低电平有效的 ...

  8. C# SpinWait 实现

    其实SpinWait的code 非常简单,以前看过很多遍,但是从来都没有整理过,整理也是再次学习吧. 我们先看看SpinWait的一些评论或者注意点吧:如果等待某个条件满足需要的时间很短,而且不希望发 ...

  9. iOS开发-模板方法模式

    模板方法模式定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤.模板方法模式是由子类决定实现算法中的步骤,工厂方法由子类决定实现哪一 ...

  10. 深入理解Git (一) - 元数据

    三分钟教你学Git仅仅是教我们会用Git了,但是内部的一些实现原理假设我们也知道一些的话会使我们使用起来更加顺手.这个系列就是在你用了Git一段时间之后,并想继续到Git的内部看一下到底而准备的. G ...