【iCore4 双核心板_FPGA】例程十四:基于I2C的ARM与FPGA通信实验
实验现象:
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通信实验的更多相关文章
- 【iCore4 双核心板_FPGA】例程十三:基于SPI的ARM与FPGA通信实验
实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符HELLO. 3.通过串口精灵发送命令可以控制ARM·LE ...
- 【iCore1S 双核心板_FPGA】例程十五:基于I2C的ARM与FPGA通信实验
实验现象: 核心代码: int main(void) { int i,n; ]; ]; HAL_Init(); system_clock.initialize(); led.initialize(); ...
- 【iCore3 双核心板】例程十四:FATFS实验——文件操作
实验指导书及代码包下载: http://pan.baidu.com/s/1dEpechF iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 【iCore4 双核心板_FPGA】例程四:Signal Tapll 实验——逻辑分析仪
实验现象: 三色led轮流闪烁,具体的逻辑分析仪使用教程请参考iCore3逻辑分析仪例程 核心代码: module signal_ctrl( input clk_25m, input rst_n, o ...
- 【iCore4 双核心板_FPGA】例程十:FSMC总线通信实验——复用地址模式
实验原理: STM32F767上自带FMC控制器,本实验将通过FMC总线的地址复用模式实现STM32与FPGA 之间通信,FPGA内部建立RAM块,FPGA桥接STM32和RAM块,本实验通过FSMC ...
- 【iCore4 双核心板_FPGA】例程十二:基于UART的ARM与FPGA通信实验
实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,会接收到字符GINGKO. 3.通过串口精灵发送命令可以控制ARM·LED和FPGA·LED. 核心代码: int main ...
- 【iCore4 双核心板_FPGA】例程十五:基于单口RAM的ARM+FPGA数据存取实验
实验现象: 写RAM命令格式:write:地址(0-255),数据(0-65535)\cr\lf 读RAM命令格式:read:地址(0-255)\cr\lf 核心代码: int main(void) ...
- 【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ int i; int address,data; ; ]; ]; char *p; /* US ...
- 【iCore4 双核心板_FPGA】例程八:乘法器实验——乘法器使用
实验现象: 程序运行时,绿色led闪烁(目前,具体的乘法器调用请参考iCore3乘法器例程) 核心代码: module multiplier_ctrl( input clk_25m, input rs ...
随机推荐
- win7 资源资源管理器访问FTP站点
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\ftp] @="URL:File Transfer Protocol" ...
- 洛谷.3273.[SCOI2011]棘手的操作(左偏树)
题目链接 还是80分,不是很懂. /* 七个操作(用左偏树)(t2表示第二棵子树): 1.合并:直接合并(需要将一个t2中原有的根节点删掉) 2.单点加:把这个点从它的堆里删了,加了再插入回去(有负数 ...
- Python3正则表达式(1)
正则表达式 作用:处理字符串.形式上检查格式 应用:文本编辑与处理.网页爬虫 特点:可以快速.准确地完成复杂的查找.替换 操作: step1:预定义模式 step2:采用预定义的模式匹配具有共同特征的 ...
- node模块包装为Promise书写法
1. const Promise = require('bluebird') const fs = Promise.promisifyAll(Promise.promisify(require('fs ...
- 解析3D标签云,其实很简单
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 最近开始用canvas搞3D了,搞得也是简单的东西,就是球体转圈.做出来后,突然想起以前看过的3D标签云,在以前觉得真心狂拽酷炫叼啊,当时 ...
- 正则表达式(特殊字符)/Xpath语法/CSS选择器
正则表达式(特殊字符) ^ 开头 '^b.*'----以b开头的任意字符 $ 结尾 '^b.*3$'----以b开头,3结尾的任意字符 * 任意长度(次数),≥0 ? 非贪婪模式,非贪婪模式尽可能少的 ...
- Java API概述
collection of APIs(Application Programming Interface) java.lang — automatically imported into Java p ...
- Linux.Centos安装scp反复失败的解决方式
现象 在A服务器用scp命令从B服务器拉文件时, 报找不到scp指令的错误 在A服务器运行 scp --help 发现是有指令的 在B服务器上 常规方式, 安装openssh-clients yum ...
- iphone程序适配ipad可以用下面的宏进行尺寸改写
//判断是否为iPad #define ISIPAD [[[UIDevice currentDevice].model substringToIndex:4] isEqualToString:@&qu ...
- Hyperledger超级账本在Centos7下搭建运行环境
超级账本(hyperledger)是Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目,加入成员包括:荷兰银行(ABN AMRO).埃森哲(Accenture)等十几个不同利益体 ...