IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 2021-07-22 -> 正文阅读

[嵌入式]2021-07-22

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、实验目的与意义

1.了解spi通信原理
2.掌握集成开发环境QuartusII集成开发环境使用方法

二、实验设备及平台

1.iCore 双核心板
2.Blaster 仿真器
3.Micro USB线缆
4.QuartusII 开发平台
5.计算机

三、实验原理

通过FPGA建立的spi模块, 对外提供接口, 与STM32的SPI相连接, Commix 串口精灵与STM32通过串口连接, 实现三者之间的通讯.
在这里插入图片描述

FPGA代码如下:

//--------------------Timescale------------------------------//
`timescale 1 ns / 1 ps
//------------------------Module_SPI-------------------------//
	/*定义端口*/
	module SPI(
					input CLK_25M,
					input spi_clk,
					input spi_mosi,
					input spi_cs,
                    
					output reg spi_miso,
					output FPGA_LEDR,
					output FPGA_LEDG,
					output FPGA_LEDB
					);
					
//-------------------------rst_n---------------------------//
	/*复位信号*/
	reg [5:0]rst_cnt = 6'd0;
	reg rst_n = 1'd0;
	always @(posedge CLK_25M)						
		if(rst_cnt == 6'd50)
			begin
				rst_n <= 1'd1;
				rst_cnt <= rst_cnt;
			end
		else rst_cnt <= rst_cnt + 1'd1;	
		
//-------------------------parameter---------------------//
	parameter ledr = {8'd108,8'd101,8'd100,8'd114},
				 ledg = {8'd108,8'd101,8'd100,8'd103},
				 ledb = {8'd108,8'd101,8'd100,8'd98},
				 hello = {8'd104,8'd101,8'd108,8'd108,8'd111};
				 
//--------------------------spi_mosi---------------------------//
	/*接收模块*/
	reg [3:0]i;
	reg [7:0]data_in;
	reg [39:0]temp_data,data;
	
	always@(posedge spi_clk or negedge rst_n)
		if(!rst_n)
			begin
				i <= 4'd0;
				temp_data <= 40'd0;
				data <= 40'd0;
				data_in <= 8'd0;
			end
		else case(i)   //从高位开始接收数据,每8个spi_clk时钟接收一个Byte
			4'd0:
				begin
					i <= i + 1'd1;
					data_in <= {data_in[6:0],spi_mosi};
					temp_data <= {temp_data[31:0],data_in};
					if(data_in == 8'd13)
						begin
							data <= temp_data;
						end
					else 
						begin
							data <= data;
						end
				end
			4'd1,4'd2,4'd3,4'd4,4'd5,4'd6:
				begin
					i <= i + 1'd1;
					data_in <= {data_in[6:0],spi_mosi};
				end
			4'd7:begin
					i <= 4'd0;
					data_in <= {data_in[6:0],spi_mosi};
				end
			default: i <= 4'd0;
		endcase
		
//--------------------------data----------------------------//
	/*对比接收数据*/
	reg [2:0]led;	
	
	always@(posedge CLK_25M or negedge rst_n)
		if(!rst_n)
			begin
				led <= 3'b111;
			end
		else if (data == ledr)
				led <= 3'b011;                   //红灯亮
		else if (data == ledg)
				led <= 3'b101;							//绿灯亮
		else if (data == ledb)
				led <= 3'b110;							//蓝灯亮
				
	assign {FPGA_LEDR,FPGA_LEDG,FPGA_LEDB} = led;

//--------------------------delay----------------------------//
	reg spi_clk_r;
	always@(posedge CLK_25M or negedge rst_n)
		if(!rst_n)
			begin
				spi_clk_r <= 1'd1;
			end
		else 
			spi_clk_r <= spi_clk; 

//--------------------------spi_miso----------------------------//
	/*发送模块*/
	reg [39:0]data_out;
	reg [5:0]j;
	
	always@(negedge spi_clk_r or negedge rst_n)
		if(!rst_n)
			begin
				data_out <= hello;
				j <= 6'd0;
			end
		else case(j)  //连续40个spi_clk_r时钟发送“hello”字符串
			6'd0:
				begin
					{spi_miso,data_out[39:1]} <= data_out;
					j <= j + 1'd1;
				end
			6'd39:
				begin
					{spi_miso,data_out[39:1]} <= data_out;
					data_out <= hello;
					j <= 6'd0;
				end
			default:
				begin
					{spi_miso,data_out[39:1]} <= data_out;
					j <= j + 1'd1;
				end
		endcase

//--------------------------endmodule----------------------------//
	endmodule

ARM主程序代码如下:


int main(void)
{	
	led.initialize();
	spi.initialize();
	usart4.initialize(9600);
	int i,n,k;
	char buffer[20];
	char spibuffer[20];

	usart4.printf("hello! I am iCore3!\r\n");                              //′??ú4ê?3?
	while(1){
		if(usart4.receive_ok_flag){                                          //?óê?íê3é
			usart4.receive_ok_flag = 0;
			for(i = 0;i < 20;i++){
				buffer[i] = tolower(usart4.receive_buffer[i]);
			}
			n = strlen(buffer);

			//±è???óê?D??¢
			if(memcmp(buffer,"ledr",strlen("ledr")) == 0){
				LED_RED_ON;
				LED_GREEN_OFF;
				LED_BLUE_OFF;
			}
			if(memcmp(buffer,"ledg",strlen("ledg")) == 0){
				LED_GREEN_ON;
				LED_RED_OFF;
				LED_BLUE_OFF;
			}	
			if(memcmp(buffer,"ledb",strlen("ledb")) == 0){
				LED_BLUE_ON;
				LED_GREEN_OFF;
				LED_RED_OFF;
			}
		spi.write_nbyte(n,buffer);																						//SPI·¢?íêy?Y
			
		for (n = 0;n < 100; n++);
			
		SPI_CS_OFF;
		for(k = 0; k < 5; k++){                                               //SPI?óê?êy?Y
			spibuffer[k] = spi.write_byte(0x00);
			}
		SPI_CS_ON;
			
		usart4.printf(spibuffer);	
		}
	}
}

四、实验步骤

  1. 把仿真器与iCore3的SWD调试口连接
  2. 把 USB-Blaster 与 iCore3 的JTAG 调试口相连
  3. 将跳线帽插在USB UART
  4. 为iCore3 供电
  5. 打开串口精灵, 找到对应的对口打开
  6. 下载FPGA程序到板子
  7. 下载ARM程序到板子
  8. 输入串口命令, 观察实验现象

五、实验现象

在Commix 上发送命令后, 对应的ARM 和 FPGA 的LED 灯亮, 同时接收显示: hello

串口发送命令格式: 				
LEDR\CR\LF						ARM_红					FPGA_红			
LEDG\CR\LF						ARM_绿					FPGA_绿	
LEDB\CR\LF						ARM_蓝					FPGA_蓝	

六、总结

1.串口精灵如何与开发板相连接? 未完待续

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 10:57:52  更:2021-07-23 10:58:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 10:36:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计