【iCore4 双核心板_FPGA】例程十三:基于SPI的ARM与FPGA通信实验
实验现象:
1、先烧写ARM程序,然后烧写FPGA程序。
2、打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符HELLO。
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 spi_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_SPI4_Init();
MX_USART6_UART_Init(); /* USER CODE BEGIN 2 */
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;
}
if(memcmp(buffer,"ledg",strlen("ledg")) == ){
LED_GREEN_ON;
LED_RED_OFF;
LED_BLUE_OFF;
}
if(memcmp(buffer,"ledb",strlen("ledb")) == ){
LED_BLUE_ON;
LED_GREEN_OFF;
LED_RED_OFF;
}
spi4.write(strlen(buffer),(unsigned char *)buffer);
for (i = ;i < ; i++); SPI4_CS_OFF;
for(i = ; i < ; i++){ //SPI½ÓÊÕÊý¾Ý
spi_buffer[i] = spi4.send_data(0x00);
}
SPI4_CS_ON; usart6.printf(spi_buffer);
}
}
/* USER CODE END 3 */ }
module spi_ctrl(
input clk_25m,
input rst_n,
input spi_clk,
input spi_mosi,
input spi_cs,
output spi_miso,
output led_red,
output led_green,
output led_blue
);
//--------------------------parameter--------------------------//
parameter ledr = {'d108,8'd101,'d100,8'd114},
ledg = {'d108,8'd101,'d100,8'd103},
ledb = {'d108,8'd101,'d100,8'd98},
hello = {'d104,8'd101,'d108,8'd108,'d111}; //--------------------------spi_mosi---------------------------//
reg[:]i;
reg[:]data_in;
reg [:]temp_data,data; always@(posedge spi_clk or negedge rst_n)
if(!rst_n)
begin
i <= 'd0;
temp_data <= 'd0;
data <= 'd0;
data_in <= 'd0;
end
else case(i) //从高位开始接收数据,每8个spi_clk时钟接收一个Byte
'd0:
begin
i <= i + 'd1;
data_in <= {data_in[:],spi_mosi};
temp_data <= {temp_data[:],data_in};
if(data_in == 'd13)
begin
data <= temp_data;
end
else
begin
data <= data;
end
end
'd1,4'd2,'d3,4'd4,'d5,4'd6:
begin
i <= i + 'd1;
data_in <= {data_in[:],spi_mosi};
end
'd7:begin
i <= 'd0;
data_in <= {data_in[:],spi_mosi};
end
default: i <= 'd0;
endcase //--------------------------data----------------------------//
/*对比接收数据*/
reg [:]led; always@(posedge clk_25m or negedge rst_n)
if(!rst_n)
begin
led <= 'b101;
end
else if (data == ledr)
led <= 'b011; //红灯亮
else if (data == ledg)
led <= 'b101; //绿灯亮
else if (data == ledb)
led <= 'b110; //蓝灯亮 assign {led_red,led_green,led_blue} = led; //--------------------------delay----------------------------//
reg spi_clk_r;
always@(posedge clk_25m or negedge rst_n)
if(!rst_n)
begin
spi_clk_r <= 'd1;
end
else
spi_clk_r <= spi_clk; //--------------------------spi_miso----------------------------//
/*发送模块*/
reg [:]data_out;
reg [:]j;
reg spi_out;
always@(negedge spi_clk_r or negedge rst_n)
if(!rst_n)
begin
data_out <= hello;
spi_out <= 'd0;
j <= 'd0;
end
else case(j) //连续40个spi_clk_r时钟发送“hello”字符串
'd0:
begin
{spi_out,data_out[:]} <= data_out;
j <= j + 'd1;
end
'd39:
begin
{spi_out,data_out[:]} <= data_out;
data_out <= hello;
j <= 'd0;
end
default:
begin
{spi_out,data_out[:]} <= data_out;
j <= j + 'd1;
end
endcase assign spi_miso = spi_out;
//--------------------------endmodule----------------------------// endmodule
源代码下载链接:
链接:http://pan.baidu.com/s/1kUDbJoz 密码:du7e
iCore4链接:

【iCore4 双核心板_FPGA】例程十三:基于SPI的ARM与FPGA通信实验的更多相关文章
- 【iCore1S 双核心板_FPGA】例程十六:基于SPI的ARM与FPGA通信实验
实验现象: 核心代码: int main(void) { int i,n; ]; ]; HAL_Init(); system_clock.initialize(); led.initialize(); ...
- 【iCore4 双核心板_FPGA】例程十七:基于FIFO的ARM+FPGA数据存取实验
实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ int i; int fsmc_read_data; ; ]; ]; char *p; /* ...
- 【iCore4 双核心板_FPGA】例程十二:基于UART的ARM与FPGA通信实验
实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,会接收到字符GINGKO. 3.通过串口精灵发送命令可以控制ARM·LED和FPGA·LED. 核心代码: int main ...
- 【iCore4 双核心板_FPGA】例程十四:基于I2C的ARM与FPGA通信实验
实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符GINGKO. 3.通过串口精灵发送命令可以控制ARM·L ...
- 【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】例程四:Signal Tapll 实验——逻辑分析仪
实验现象: 三色led轮流闪烁,具体的逻辑分析仪使用教程请参考iCore3逻辑分析仪例程 核心代码: module signal_ctrl( input clk_25m, input rst_n, o ...
- 【iCore4 双核心板_FPGA】例程八:乘法器实验——乘法器使用
实验现象: 程序运行时,绿色led闪烁(目前,具体的乘法器调用请参考iCore3乘法器例程) 核心代码: module multiplier_ctrl( input clk_25m, input rs ...
- 【iCore4 双核心板_FPGA】例程二:GPIO输入实验——识别按键输入
实验现象: 按键每按下一次,三色LED切换一次状态. 核心源代码: module key_ctrl( input clk_25m, input rst_n, input key, output fpg ...
随机推荐
- How to use Jackson to deserialise an array of objects
first create a mapper : import com.fasterxml.jackson.databind.ObjectMapper; ObjectMapper mapper = ne ...
- luogu P4178 Tree
题目链接 luogu P4178 Tree 题解 点分治 代码 // luogu-judger-enable-o2 #include<cstdio> #include<algorit ...
- CodeForces903G Yet Another Maxflow Problem 扫描线 + 线段树 + 最小割
给定两条链\(A, B\),其中\(A\)链某些点向\(B\)链有连边,支持修改\(A\)链中的某条边权以及查询\(A_1\)到\(B_n\)的最大流 显而易见,\(A\)和\(B\)链中一定满足左部 ...
- 提升PHP安全:8个必须修改的PHP默认配置
很明显,PHP+Mysql+Apache是很流行的web技术,这个组合功能强大,可扩展性强,还是免费的.然而,PHP的默认设置对已经上线的网站不是那么适合.下面通过修改默认的配置文件加强PHP的安全策 ...
- AD软件原理图封装过程(即由原理图转换到PCB)
第一步:先画出你所要的原理图 第二步:点击菜单栏的工具→封装管理器,进去封装管理器页面,点击左边的每一个元件, 然后选择封装时的元器件,再点击右边的确定(每一个元器件确定好封装要用的元件都要点确定) ...
- 支付宝支付集成过程中如何生成商户订单号(out_trade_no)
out_trade_no是指商户网站唯一订单号,在商户端唯一,每个商户订单号会对应一个支付宝订单号 ,此订单号由珊瑚自己生成,商户订单号要求64个字符以内.可包含字母.数字.下划线:需保证在商户端不重 ...
- 动态ip、静态ip、pppoe拨号的区别
pppoe拨号 pppoe拨号上网,又叫做ADSL拨号上网.宽带拨号上网.指现在有很多我的E家用户,送的无线猫,阉割了PPPOE拨号功能,必须要从电脑上拨号才能上网.还有大街上的WIFI热点也很多,如 ...
- caffe实际运行中遇到的问题
https://blog.csdn.net/u010417185/article/details/52649178 1.均值计算是否需要统一图像的尺寸? 在图像计算均值时,应该先统一图像的尺寸,否则会 ...
- LeetCode题库13. 罗马数字转整数(c++实现)
问题描述: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ...
- Spring Boot异常处理
一.默认映射 我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局 ...