实验现象:

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. 李宏毅机器学习笔记1:Regression、Error

    李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...

  2. JFreeChart 之柱状图

    JFreeChart 之柱状图 一.JFreeChart 简介 JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applets ...

  3. BZOJ.4566.[HAOI2016]找相同字符(后缀数组 单调栈)

    题目链接 给定两个字符串,求它们有多少个相同子串.相同串的位置不同算多个. POJ3145简化版. 后缀自动机做法见这儿,又快又好写(一下就看出差距了..) //13712kb 4076ms #inc ...

  4. Python3科学计算库概况

    Python3科学计算常见库入门 Numpy快速数据处理库 参见我的博客 http://www.cnblogs.com/brightyuxl/p/8981294.html http://www.cnb ...

  5. Django关于设置自定义404和安装debug-toolbar的笔记

    Django关于设置自定义404和安装debug-toolbar的笔记 关于设置404 先做好404页面,然后在views.py文件中做好映射,最后是在urls.py做好路由,而这个urls.py必须 ...

  6. 理清cordova插件的调用流程

    从调用的角度看流程  前端调用(clobbers)——>cordova_plugins.js(clobbers对应插件id和插件文件所在的路径)—–>js部分(配置着插件的名字,已经插件里 ...

  7. 当删除某一个jar包时tomcat中出现problem encountered while deleting resources问题

    http://blog.csdn.net/u013226462/article/details/17715031

  8. Unity 鼠标个性化

    最初的版本,API是可以直接设置鼠标显示与否的,新版本就改了,先上下旧店的版本的: 1.思路: 在某些游戏下,经常会隐藏鼠标,或者有绚丽的动画来代替鼠标显示. 原理就是将鼠标隐藏(不显示)起来,设置一 ...

  9. 喵哈哈村的魔法考试 Round #15 (Div.2) 题解

    哗啦啦村的奇迹果实(一) 题解:显然答案就是最大值减去最小值. #include<bits/stdc++.h> using namespace std; const int maxn = ...

  10. Codeforces Round #406 (Div. 1) B. Legacy 线段树建图跑最短路

    B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...