树莓派4B学习札记

时间:2024-02-23 18:12:21

防静电

树莓派比较容易被静电损坏,要做好以下预防措施

  1. 使用的时候不要用手去触摸PCB和针脚!特别是上电之后!
  2. 拿板卡的时候,要习惯性拿板卡的边缘
  3. 勤洗手,勤摸墙壁,释放身上的静电

系统安装

  • 8GB以上的Mirco SD卡
  • 读卡器

将SD卡连接到电脑,格式化SD卡

树莓派官网下载烧录程序,从左到右完成设置,写入SD卡

image

完成后将SD卡插入卡槽,首次启动还需要连接键盘鼠标和显示器(HDMI转接线),连接电源线后给树莓派上电,完成初始化设定。

使用命令行查询树莓派的硬件参数

查看CPU信息

$ lscpu

Architecture: armv7l Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: 0-3 Thread(s) per core: 1 Core(s) per socket: 4 Socket(s): 1 Vendor ID: ARM Model: 3 Model name: Cortex-A72 Stepping: r0p3 CPU max MHz: 1500.0000 CPU min MHz: 600.0000

查看内存的使用情况。

free -h

查看SD卡的存储情况

$ sudo fdisk -l

查看操作系统的信息

$ uname -a

Linux raspberrypi 5.10.63-v7l+ #1459 SMP Wed Oct 6 16:41:57 BST 2021 armv7l GNU/Linux

查看网络接口

$ ifconfig

这个命令很重要!!!

查看板卡信息

$ pinout

image

从这里可用知道这块树莓派是Model 4B型号,BCM2711,可以去读对应的官方文档。

局域网远程桌面

安装xrdp

检查树莓派的网络,使用ping命令

image

输入命令

$ sudo apt-get install xrdp

回车之后会自动进入安装,安装完成后输入命令

$ ifconfig

image

记住划线处的IP地址

远程桌面

在主机,按下win + r组合键,输入cmd,回车,ping刚刚加下的地址
image

确认连通后,按下win + q,输入远程桌面
image

输入之前记下的IP地址

image

输入用户名pi和密码,连接

image

连接成功!

image

用远程桌面来操控树莓派,可以省去很多麻烦。

需要注意的事项

  • 树莓派和主机需要处在同一个局域网内,连接之前多ping几次确认连通
  • 使用win + Q搜索远程桌面打开,输入用户名pi注意不要大写,否则会出现load failed for Display 0的错误

参考

https://shumeipai.nxez.com/2013/10/06/windows-remote-desktop-connection-raspberry-pi.html

SPI总线通信

SPI是什么

官方文档链接
SPI总线是一种串行总线

MOTOROLA公司的SPI总线的基本信号线为3根传输线,即

  • MOSI:主片数据输出和从片数据输入
  • MISO:从片数据输出和主片数据输入
  • SCK: 主片在这条线上发出SCK频率,用来决定传输速率

image

主片通过发出片选信号/cs来选择和哪个从片进行通信,当某个从片的/cs信号有效时,便能通过MOSI传输线接受指令、数据,并通过MISO传输线发回数据。

对具有SPI接口的从片器件来讲,SCK、MOSI是输入信号,MISO是输出信号。

  • SCK用于主片和从片通信的同步
  • MOSI用于将信息传输到器件

指令、地址和数据的变化在SCK的低电平期间进行,并由SCK信号的上升沿锁存。

  • MISO用于将信息从器件传出

传出的信息包括状态和数据,信息在SCK信号的下降沿送出。

利用SPI总线进行自发自收

树莓派提供了一组GPIO接口,找到MOSI和MISO引脚
image

在官方文档中进一步查询得到更多信息

image

用一个跳线帽短接MOSI和MISO,让树莓派通过SPI总线实现自发自收

在树莓派的终端输入

$ sudo raspi-config

回车,进入设置界面

![image](https://img20image

按下选到3 Interface Options

image

image

回车开启SPI总线后,退出设置界面

用命令行创建一个c语言文件,将下列代码粘贴到里面保存

/*代码来源:https://blog.csdn.net/u014357799/article/details/112376163/*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "SPISet.h"
#include <stdint.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/ioctl.h>
#include <asm/ioctl.h>
#include <linux/spi/spidev.h>

static const char *spiDev0 = "/dev/spidev0.0";
static const char *spiDev1 = "/dev/spidev0.1";
static uint8_t spiBPW = 8;
static uint16_t spiDelay = 0;
static uint32_t spiSpeeds [2];
static int spiFds [2];

int SPIDataRW ( int channel, unsigned char *tx_data, unsigned char *rx_data, int len );
int SPISetupMode ( int channel, int speed, int mode );
int SPISetup( int channel, int speed );
int initSPI();

int main(){
	char tx_Data[] = {1,2,3,4,5,6,7,8,9,10};
	char rx_Data[] = {0,0,0,0,0,0,0,0,0,0};
	int i = 0;
	initSPI();
	while(1){
		SPIDataRW(0, tx_Data, rx_Data, 10);
		printf("read SPI_rx_data is: \n");
		for( i = 0; i < 10; i++ ){
			printf("%d\t",rx_Data[i]);
		}
		printf("\n");
		sleep(1);
	}
	return 0;
}

int initSPI(){
	int spiFd;
	spiFd = SPISetup(0,500000);
	if( spiFd == -1 ){
		printf("init spi failed!\n");
	}
}

int SPIDataRW (int channel, unsigned char *tx_data, unsigned char *rx_data, int len) {
	int i = 0;
	struct spi_ioc_transfer spi ;
	channel &= 1 ;
	memset (&spi, 0, sizeof (spi)) ;
	spi.tx_buf = (unsigned long)tx_data ;
	spi.rx_buf = (unsigned long)rx_data ;
	spi.len = len ;
	spi.delay_usecs = spiDelay ;
	spi.speed_hz = spiSpeeds [channel] ;
	spi.bits_per_word = spiBPW ;

	return ioctl (spiFds [channel], SPI_IOC_MESSAGE(1), &spi) ; //SPI_IOC_MESSAGE(1)的1表示spi_ioc_transfer的数量
}

int SPISetupMode (int channel, int speed, int mode) {
	int fd ;
	if ((fd = open (channel == 0 ? spiDev0 : spiDev1, O_RDWR)) < 0) {
		printf("Unable to open SPI device: %s\n", strerror (errno)) ;
		return -1;
	}
	spiSpeeds [channel] = speed ;
	spiFds [channel] = fd ;
	if (ioctl (fd, SPI_IOC_WR_MODE, &mode) < 0)	{
		printf("Can\'t set spi mode: %s\n", strerror (errno)) ;
		return -1;
	}
	if (ioctl (fd, SPI_IOC_RD_MODE, &mode) < 0) {
		printf("Can\'t get spi mode: %s\n", strerror (errno)) ;
		return -1;
	}
	if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0) {
		printf("Can\'t set bits per word: %s\n", strerror (errno)) ;
		return -1;
	}
	if (ioctl (fd, SPI_IOC_RD_BITS_PER_WORD, &spiBPW) < 0) {
		printf("Can\'t get bits per word: %s\n", strerror (errno)) ;
		return -1;	
	}
	if (ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) {
		printf("Can\'t set max speed hz: %s\n", strerror (errno));
		return -1;
	}
	if (ioctl (fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
		printf("Can\'t get max speed hz: %s\n", strerror (errno)); 
		return -1; 
	}
	return fd ; 
}

int SPISetup (int channel, int speed) {
	return SPISetupMode (channel, speed, 0) ;
}

保存后用gcc命令编译生成.out文件,执行

image

取下跳线帽后,再次运行

image

至此完成了树莓派通过SPI总线自收自发的任务

SPI通信的最大速率?

https://www.cnblogs.com/qiyuexin/p/6417830.html

留坑

WIFI传输数据?

留坑

参考链接

https://blog.csdn.net/u014357799/article/details/112376163
https://panqiincs.me/2020/07/10/rpi-stm32-spi-communication/
https://www.raspberrypi.com/documentation/