树莓派4B运行SPI提速(MIT 机械狗程序)
MIT 主体代码不能直接运行,需要修改。其中:SPI通讯部分,默认代码运行会出现片选信号引脚无法拉低,导致树莓派与SPINE 通讯,只能在运行时发送一次数据,后续无法进入中断,
可以加上如下代码,调用树莓派自带库执行GPIO 操作,拉低在拉高
第一步:初始化ce0, ce1 引脚输出
int spi_open() {int rv = 0;// wiringPiSetup();// pinMode(ce0,OUTPUT);// pinMode(ce1,OUTPUT);bcm2835_init();bcm2835_gpio_fsel(ce0,BCM2835_GPIO_FSEL_OUTP);bcm2835_gpio_fsel(ce1,BCM2835_GPIO_FSEL_OUTP);spi_1_fd = open("/dev/spidev0.0", O_RDWR);if (spi_1_fd < 0) perror("[ERROR] Couldn't open spidev 2.0");spi_2_fd = open("/dev/spidev0.1", O_RDWR);if (spi_2_fd < 0) perror("[ERROR] Couldn't open spidev 2.1");rv = ioctl(spi_1_fd, SPI_IOC_WR_MODE, &spi_mode);if (rv < 0) perror("[ERROR] ioctl spi_ioc_wr_mode (1)");rv = ioctl(spi_2_fd, SPI_IOC_WR_MODE, &spi_mode);if (rv < 0) perror("[ERROR] ioctl spi_ioc_wr_mode (2)");rv = ioctl(spi_1_fd, SPI_IOC_RD_MODE, &spi_mode);if (rv < 0) perror("[ERROR] ioctl spi_ioc_rd_mode (1)");rv = ioctl(spi_2_fd, SPI_IOC_RD_MODE, &spi_mode);if (rv < 0) perror("[ERROR] ioctl spi_ioc_rd_mode (2)");rv = ioctl(spi_1_fd, SPI_IOC_WR_BITS_PER_WORD, &spi_bits_per_word);if (rv < 0) perror("[ERROR] ioctl spi_ioc_wr_bits_per_word (1)");rv = ioctl(spi_2_fd, SPI_IOC_WR_BITS_PER_WORD, &spi_bits_per_word);if (rv < 0) perror("[ERROR] ioctl spi_ioc_wr_bits_per_word (2)");rv = ioctl(spi_1_fd, SPI_IOC_RD_BITS_PER_WORD, &spi_bits_per_word);if (rv < 0) perror("[ERROR] ioctl spi_ioc_rd_bits_per_word (1)");rv = ioctl(spi_2_fd, SPI_IOC_RD_BITS_PER_WORD, &spi_bits_per_word);if (rv < 0) perror("[ERROR] ioctl spi_ioc_rd_bits_per_word (2)");rv = ioctl(spi_1_fd, SPI_IOC_WR_MAX_SPEED_HZ, &spi_speed_wr);if (rv < 0) perror("[ERROR] ioctl spi_ioc_wr_max_speed_hz (1)");rv = ioctl(spi_2_fd, SPI_IOC_WR_MAX_SPEED_HZ, &spi_speed_wr);if (rv < 0) perror("[ERROR] ioctl spi_ioc_wr_max_speed_hz (2)");rv = ioctl(spi_1_fd, SPI_IOC_RD_MAX_SPEED_HZ, &spi_speed_rd);if (rv < 0) perror("[ERROR] ioctl spi_ioc_rd_max_speed_hz (1)");rv = ioctl(spi_2_fd, SPI_IOC_RD_MAX_SPEED_HZ, &spi_speed_rd);if (rv < 0) perror("[ERROR] ioctl spi_ioc_rd_max_speed_hz (2)");rv = ioctl(spi_1_fd, SPI_IOC_RD_LSB_FIRST, &lsb);if (rv < 0) perror("[ERROR] ioctl spi_ioc_rd_lsb_first (1)");rv = ioctl(spi_2_fd, SPI_IOC_RD_LSB_FIRST, &lsb);if (rv < 0) perror("[ERROR] ioctl spi_ioc_rd_lsb_first (2)");perror("[ERROR] here 2");return rv;
}
再将
spi_board == 0 ? bcm2835_gpio_write(ce0,LOW) : bcm2835_gpio_write(ce1,LOW);
spi_board == 0 ? bcm2835_gpio_write(ce0,HIGH) : bcm2835_gpio_write(ce1,HIGH);
加入代码中。这样树莓派就可以正常发送SPI 数据了。
具体代码如下:
void spi_send_receive(spi_command_t *command, spi_data_t *data) {// update driver status flagspi_driver_iterations++;data->spi_driver_status = spi_driver_iterations << 16;// transmit and receive buffersuint16_t tx_buf[K_WORDS_PER_MESSAGE];uint16_t rx_buf[K_WORDS_PER_MESSAGE];for (int spi_board = 0; spi_board < 2; spi_board++) {// copy command into spine type:spi_to_spine(command, &g_spine_cmd, spi_board * 2);// pointers to command/data spine arrayuint16_t *cmd_d = (uint16_t *)&g_spine_cmd;uint16_t *data_d = (uint16_t *)&g_spine_data;// zero rx buffermemset(rx_buf, 0, K_WORDS_PER_MESSAGE * sizeof(uint16_t));// copy into tx buffer flipping bytesfor (int i = 0; i < K_WORDS_PER_MESSAGE; i++)// {tx_buf[i] = (cmd_d[i] >> 8) + ((cmd_d[i] & 0xff) << 8);}// tx_buf[i] = __bswap_16(cmd_d[i]);// each word is two bytes longsize_t word_len = 1; // 16 bit word 注意,为了提升SPI 传输速度, // //spi_bits_per_word 由8-》16 // spi message structstruct spi_ioc_transfer spi_message[1];// zero message struct.memset(spi_message, 0, 1 * sizeof(struct spi_ioc_transfer));// set up message structfor (int i = 0; i < 1; i++) {spi_message[i].bits_per_word = spi_bits_per_word; spi_message[i].cs_change = 1;spi_message[i].delay_usecs = 0;spi_message[i].word_delay_usecs =0;spi_message[i].len = word_len * K_WORDS_PER_MESSAGE;spi_message[i].rx_buf = (uint64_t)rx_buf;spi_message[i].tx_buf = (uint64_t)tx_buf;}// do spi communication// spi_board == 0 ? digitalWrite(ce0,0) : digitalWrite(ce1,0);spi_board == 0 ? bcm2835_gpio_write(ce0,LOW) : bcm2835_gpio_write(ce1,LOW); //加上这句,先拉低int rv = ioctl(spi_board == 0 ? spi_1_fd : spi_2_fd, SPI_IOC_MESSAGE(1),&spi_message);spi_board == 0 ? bcm2835_gpio_write(ce0,HIGH) : bcm2835_gpio_write(ce1,HIGH); //再拉高(void)rv;// flip bytes the other wayfor (int i = 0; i < 30; i++)data_d[i] = (rx_buf[i] >> 8) + ((rx_buf[i] & 0xff) << 8);// data_d[i] = __bswap_16(rx_buf[i]);usleep(1);// copy back to dataspine_to_spi(data, &g_spine_data, spi_board * 2);}
}
为了提升SPI 通讯速度,可以将报文帧缩短成两个报文
struct spi_command_t_goal
{float q_des_yaw[2];float q_des_pitch[2];float q_des_spin[2];float qd_des_yaw[2];float qd_des_pitch[2];float qd_des_spin[2]; float tau_yaw_ff[2];float tau_pitch_ff[2];float tau_spin_ff[2];int32_t checksum;
};struct spi_command_t_parameter
{float kp_yaw[2];float kp_pitch[2];float kp_spin[2];float kd_yaw[2];float kd_pitch[2];float kd_spin[2];int32_t flags[2];int8_t motormode[6];int32_t checksum;
};
阻抗参数不是每次都配置,可以分开,每次发送运行位置信息,报文变短,发送速率会加快
unsigned char spi_bits_per_word = 8;unsigned int spi_speed_wr = 4000000; //可以将写的频率改为4M, 6M会乱码
unsigned int spi_speed_rd = 12000000;
// each word is two bytes longsize_t word_len = 2; // 16 bit word
实测修改之前,树莓派运行MIT cheetah software 主体程序500HZ, 修改完可以达到1600HZ,不修改带宽上不去。而且乱码校验失败
运行结果截图:实测1000HZ+
树莓派4B运行SPI提速(MIT 机械狗程序)相关推荐
- 【视频】树莓派4B运行OpenWrt系统通过华为ME909s模块实现4G软路由数据分享
By Mcuzone 关键词:Raspberry Pi 4B 3B RPI HUAWEI ME909 4G LTE openwrt 软路由 soft router 蜂窝数据 Wi ...
- MIT机械狗方案电机连接测试程序
运动模式自动切换测试 一年前,从电机驱动开始入门,基于MIT开源方案,独自完成了机械狗所有硬件电路,代码,控制源码设计优化,机械结构由实验室两位机械大佬完成.实现了实时检测电机工作状态,确保各个电机工 ...
- 树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码
树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码 文章目录 树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码 一. Servo Driver ...
- 使用树莓派4b和OpenCV做机械臂夹取
文章目录 前言 一.基本功能 二.主要代码 1.图像处理部分 2.舵机驱动部分 前言 本人第一次在csdn上发技术类文章,原谅在此多说一些废话.项目是自己的毕设,比较简单还望不要见笑,如果发现有什么问 ...
- 2022最新树莓派4B学习笔记:系统备份 OpenCV SPI TFT HTML
树莓派4B学习笔记 一.首次使用 1.系统烧录 2.优化配置与备份 3.一些基本操作 二.摄像头 三.Pi Dashboard好看的仪表盘 四.OpenCV安装编译 五.SPI_TFT屏幕 六.最终代 ...
- 【树莓派学习笔记】树莓派4B上运行uboot并从网络启动linux内核(上)
[树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 文章目录 [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 前言 1. 硬件需求与软件版本汇总 ...
- 树莓派 4b 可执行文件 无法双击运行_云拆机,一起来看看树莓派的新品——Raspberry Pi 400...
两天前,树莓派基金会发布了一款有趣的新产品--Raspberry Pi 400. 本质上是一款把树莓派板子集成到键盘的电脑.(其实早在2012年,就已经有国外的创客自己把树莓派改装进键盘的操作了) 不 ...
- 树莓派uefi引导linux卡死,树莓派4B 折腾Windows 10 ARM版前传之运行UEFI引导
树莓派4入手后,不能让他吃灰.玩玩Windows Arm系统试下,非Iot系统.兵马未动,粮草先行,也让大家少走一些弯路,将Raspberry Pi 4B运行UEFP的过程分享一下.大部分资源来自国外 ...
- 树莓派4b hat板机械图ad版(ad6.9)
树莓派4b AD机械图 如下 图中绘制了机械层1和禁止布线层.其他层可以更加自己的需求选择. 详细的机械图如下 文件下载链接 链接:https://pan.baidu.com/s/1D32SlOvUa ...
最新文章
- 报告 | 野蛮数据时代,企业和从业者如何应对变革焦虑?
- 配对MPLS和SD-WAN是一个双赢的方案
- 吴恩达《优化深度神经网络》精炼笔记(3)-- 超参数调试、Batch正则化和编程框架...
- 中导入pygame_Pygame(二)--线条的艺术
- 网站api自己怎么写_网站描述怎么写?对网站优化有什么作用?
- unity NGUI 一些操作记录
- 树形DP+树状数组 HDU 5877 Weak Pair
- hadoop HA 之 QJM
- Angular ngTemplateOutlet
- opencv2对于读书笔记——二值化——thresholded功能
- Android/ios手机销售榜信息
- UnityGI4:混合光照
- 程序默认用管理员身份打开(vs2010)
- java开发坦克大战小游戏
- 腾讯云为什么做不过阿里云?说腾讯云败了合适吗?
- Navicat Premium 用于增强您的数据库管理系统
- matlab 画海面图,教你画波光粼粼的海面
- WC2016 挑战NPC
- android音频编辑之音频合成
- 脏读、幻读、不可重复读,傻傻分不清楚
热门文章
- 你还在为博客访问量少而发愁么?
- 一带一路中国出口马来西亚主要商品及货源地
- Unity鼠标拖动物体、按下鼠标左键旋转观察物体、鼠标滚轮缩放视野
- 微信群如何设置只提醒包含某个关键字的消息
- 明哥-带你三步开发JavaSE跨平台视频播放器
- 上门预约程序公众号模块 完美版
- c#中的访问修饰符Protected,privet ,public, internal,和internal protected
- 适配 iPhone13、iPhone13 pro、iPhone13 proMax
- 选择大于努力,错失字节跳动数亿身价,含泪分享
- 一个程序员靠一段Java代码,在几小时之内就赚了500美元