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 机械狗程序)相关推荐

  1. 【视频】树莓派4B运行OpenWrt系统通过华为ME909s模块实现4G软路由数据分享

    By Mcuzone 关键词:Raspberry Pi  4B  3B RPI  HUAWEI  ME909  4G  LTE  openwrt  软路由  soft router  蜂窝数据  Wi ...

  2. MIT机械狗方案电机连接测试程序

    运动模式自动切换测试 一年前,从电机驱动开始入门,基于MIT开源方案,独自完成了机械狗所有硬件电路,代码,控制源码设计优化,机械结构由实验室两位机械大佬完成.实现了实时检测电机工作状态,确保各个电机工 ...

  3. 树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码

    树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码 文章目录 树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码 一. Servo Driver ...

  4. 使用树莓派4b和OpenCV做机械臂夹取

    文章目录 前言 一.基本功能 二.主要代码 1.图像处理部分 2.舵机驱动部分 前言 本人第一次在csdn上发技术类文章,原谅在此多说一些废话.项目是自己的毕设,比较简单还望不要见笑,如果发现有什么问 ...

  5. 2022最新树莓派4B学习笔记:系统备份 OpenCV SPI TFT HTML

    树莓派4B学习笔记 一.首次使用 1.系统烧录 2.优化配置与备份 3.一些基本操作 二.摄像头 三.Pi Dashboard好看的仪表盘 四.OpenCV安装编译 五.SPI_TFT屏幕 六.最终代 ...

  6. 【树莓派学习笔记】树莓派4B上运行uboot并从网络启动linux内核(上)

    [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 文章目录 [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 前言 1. 硬件需求与软件版本汇总 ...

  7. 树莓派 4b 可执行文件 无法双击运行_云拆机,一起来看看树莓派的新品——Raspberry Pi 400...

    两天前,树莓派基金会发布了一款有趣的新产品--Raspberry Pi 400. 本质上是一款把树莓派板子集成到键盘的电脑.(其实早在2012年,就已经有国外的创客自己把树莓派改装进键盘的操作了) 不 ...

  8. 树莓派uefi引导linux卡死,树莓派4B 折腾Windows 10 ARM版前传之运行UEFI引导

    树莓派4入手后,不能让他吃灰.玩玩Windows Arm系统试下,非Iot系统.兵马未动,粮草先行,也让大家少走一些弯路,将Raspberry Pi 4B运行UEFP的过程分享一下.大部分资源来自国外 ...

  9. 树莓派4b hat板机械图ad版(ad6.9)

    树莓派4b AD机械图 如下 图中绘制了机械层1和禁止布线层.其他层可以更加自己的需求选择. 详细的机械图如下 文件下载链接 链接:https://pan.baidu.com/s/1D32SlOvUa ...

最新文章

  1. 报告 | 野蛮数据时代,企业和从业者如何应对变革焦虑?
  2. 配对MPLS和SD-WAN是一个双赢的方案
  3. 吴恩达《优化深度神经网络》精炼笔记(3)-- 超参数调试、Batch正则化和编程框架...
  4. 中导入pygame_Pygame(二)--线条的艺术
  5. 网站api自己怎么写_网站描述怎么写?对网站优化有什么作用?
  6. unity NGUI 一些操作记录
  7. 树形DP+树状数组 HDU 5877 Weak Pair
  8. hadoop HA 之 QJM
  9. Angular ngTemplateOutlet
  10. opencv2对于读书笔记——二值化——thresholded功能
  11. Android/ios手机销售榜信息
  12. UnityGI4:混合光照
  13. 程序默认用管理员身份打开(vs2010)
  14. java开发坦克大战小游戏
  15. 腾讯云为什么做不过阿里云?说腾讯云败了合适吗?
  16. Navicat Premium 用于增强您的数据库管理系统
  17. matlab 画海面图,教你画波光粼粼的海面
  18. WC2016 挑战NPC
  19. android音频编辑之音频合成
  20. 脏读、幻读、不可重复读,傻傻分不清楚

热门文章

  1. 你还在为博客访问量少而发愁么?
  2. 一带一路中国出口马来西亚主要商品及货源地
  3. Unity鼠标拖动物体、按下鼠标左键旋转观察物体、鼠标滚轮缩放视野
  4. 微信群如何设置只提醒包含某个关键字的消息
  5. 明哥-带你三步开发JavaSE跨平台视频播放器
  6. 上门预约程序公众号模块 完美版
  7. c#中的访问修饰符Protected,privet ,public, internal,和internal protected
  8. 适配 iPhone13、iPhone13 pro、iPhone13 proMax
  9. 选择大于努力,错失字节跳动数亿身价,含泪分享
  10. 一个程序员靠一段Java代码,在几小时之内就赚了500美元