树莓派4B学习札记
防静电
树莓派比较容易被静电损坏,要做好以下预防措施
- 使用的时候不要用手去触摸PCB和针脚!特别是上电之后!
- 拿板卡的时候,要习惯性拿板卡的边缘
- 勤洗手,勤摸墙壁,释放身上的静电
系统安装
- 8GB以上的Mirco SD卡
- 读卡器
将SD卡连接到电脑,格式化SD卡
在树莓派官网下载烧录程序,从左到右完成设置,写入SD卡
完成后将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
从这里可用知道这块树莓派是Model 4B
型号,BCM2711
,可以去读对应的官方文档。
局域网远程桌面
安装xrdp
检查树莓派的网络,使用ping
命令
输入命令
$ sudo apt-get install xrdp
回车之后会自动进入安装,安装完成后输入命令
$ ifconfig
记住划线处的IP地址
远程桌面
在主机,按下win + r
组合键,输入cmd
,回车,ping刚刚加下的地址
确认连通后,按下win + q
,输入远程桌面
输入之前记下的IP地址
输入用户名pi
和密码,连接
连接成功!
用远程桌面来操控树莓派,可以省去很多麻烦。
需要注意的事项
- 树莓派和主机需要处在同一个局域网内,连接之前多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频率,用来决定传输速率
主片通过发出片选信号/cs
来选择和哪个从片进行通信,当某个从片的/cs
信号有效时,便能通过MOSI传输线接受指令、数据,并通过MISO传输线发回数据。
对具有SPI接口的从片器件来讲,SCK、MOSI是输入信号,MISO是输出信号。
- SCK用于主片和从片通信的同步
- MOSI用于将信息传输到器件
指令、地址和数据的变化在SCK的低电平期间进行,并由SCK信号的上升沿锁存。
- MISO用于将信息从器件传出
传出的信息包括状态和数据,信息在SCK信号的下降沿送出。
利用SPI总线进行自发自收
树莓派提供了一组GPIO接口,找到MOSI和MISO引脚
在官方文档中进一步查询得到更多信息
用一个跳线帽短接MOSI和MISO,让树莓派通过SPI总线实现自发自收
在树莓派的终端输入
$ sudo raspi-config
回车,进入设置界面
![image](https://img20
按下选到3 Interface Options
回车开启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
文件,执行
取下跳线帽后,再次运行
至此完成了树莓派通过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/