157 spi 应用层例程

如何利用spidev.c万能驱动来实现一个简单的iic通信。

#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <linux/spi/spidev.h>

/*SPI 接收 、发送 缓冲区*/
unsigned char tx_buffer[100] = "hello the world !";
unsigned char rx_buffer[100];

int fd;                  // SPI 控制引脚的设备文件描述符
static  uint32_t mode=0;           //用于保存 SPI 工作模式
static  uint8_t bits = 8;        // 接收、发送数据位数
static  uint32_t speed = 500000; // 发送速度

/*
* 错误处理函数。
*/
void pabort(const char *s)
{
  perror(s);
  abort();
}

/*
* 初始化SPI ,初始化OLED 使用到的命令、数据控制引脚
*/
void spi_init(void)
{
    int ret = 0;

    /*打开 SPI 设备*/
    fd = open("/dev/spidev2.0", O_RDWR);
    if (fd < 0)
    {
    pabort("can't open /dev/spidev2.0 ");
    }

    /*
        * spi mode 设置SPI 工作模式
        */
    ret = ioctl(fd, SPI_IOC_WR_MODE32, &mode);
    if (ret == -1)
    pabort("can't set spi mode");

    ret = ioctl(fd, SPI_IOC_RD_MODE32, &mode);
    if (ret == -1)
    pabort("can't get spi mode");

    /*
        * bits per word  设置一个字节的位数
        */
    ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
    if (ret == -1)
    pabort("can't set bits per word");

    ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
    if (ret == -1)
    pabort("can't get bits per word");

    /*
        * max speed hz  设置SPI 最高工作频率
        */
    ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
    if (ret == -1)
    pabort("can't set max speed hz");

    ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
    if (ret == -1)
    pabort("can't get max speed hz");

    printf("spi mode: 0x%x\n", mode);
    printf("bits per word: %d\n", bits);
    printf("max speed: %d Hz (%d KHz)\n", speed, speed / 1000);
}

void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
{
  int ret;
  int out_fd;
  struct spi_ioc_transfer tr = {
      .tx_buf = (unsigned long)tx,
      .rx_buf = (unsigned long)rx,
      .len = len,
  };

  ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
  if (ret < 1)
  {
    pabort("can't send spi message");
  }
}

int main(int argc, char *argv[])
{
    int ret;
	/*初始化SPI */
	spi_init();

    /*执行发送*/
	transfer(fd, tx_buffer, rx_buffer, sizeof(tx_buffer));

	/*打印 tx_buffer 和 rx_buffer*/
	printf("tx_buffer: \n %s\n ", tx_buffer);
	printf("rx_buffer: \n %s\n ", rx_buffer);
    

	close(fd);

	return 0;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32G070 LL程是一种针对STM32G070微控制器编写的低级别驱动程序,用于直接控制外围设备。它具有与硬件直接通信的能力,可以为特定的应用程序提供更高的效率和灵活性。 STM32G070 LL程的优点之一是,它是基于寄存器级编程的,这意味着开发人员可以对设备的每个寄存器进行细粒度的控制。此外,由于它的代码直接与硬件进行通信,因此可以显著提高系统的性能和响应能力。 LL程还提供了许多外设驱动程序,包括通用串行总线(GSB)、通用异步接收/传输器(UART)、SPI接口等。每个外设驱动程序都为开发人员提供了底层控制和配置工具,以满足不同的应用要求。 此外,STM32G070 LL程还包括各种示程序,以帮助开发人员加快开发速度。这些示程序涵盖了许多不同的应用场景,并提供了参考实现以及针对不同设置进行的说明。 总之,STM32G070 LL程是一种优秀的工具,可以帮助开发人员更好、更快速地开发STM32G070应用程序,提高系统的性能和灵活性。 ### 回答2: STM32G070是ST电子推出的一款低功耗高性能的微控制器芯片,该芯片集成了丰富的外设资源,支持多种通信协议,能够满足各种低功耗应用需求。 LL程是STM32芯片的底层外设驱动程序库,具有轻量级、高效率的特点,能够提供更高的性能、更小的代码占用空间和更快的开发速度。 对于STM32G070芯片而言,ST电子提供了LL程,包括GPIO、USART、SPI、RTC、I2C等外设的驱动程序库,方便开发者在开发过程中快速进行外设的配置和操作。 在LL程的使用过程中,开发者可以通过ST的官方文档和程进行学习和使用。其中,程包括了各种外设功能实现的代码示,方便开发者进行参考和学习,同时ST还提供了基于HAL库封装的更高层次的API函数,进一步提高了代码的易用性和可维护性。 总之,STM32G070 LL程为开发者提供了丰富的外设驱动程序库,降低了开发者在STM32G070芯片上进行开发的难度,同时也大大提高了整个开发过程的效率。 ### 回答3: STM32G070是ST公司推出的一款系列低功耗微控制器,拥有高性能、低功耗和丰富的外设。作为一款强大的微控制器,STM32G070需要用到各种不同的程来对其进行开发和控制,而LL程则是其中最为重要的一种。 LL程全称为“Low-Layer(低层)程”,通常用于直接控制寄存器和外设的寄存器,以便实现更加精细的控制与操作。该程可以提供更高的精度和更快的速度,同时还可以更加方便地进行定制和扩展。 在STM32G070开发中,可以使用LL程来实现各种不同的控制功能,如GPIO、UART、SPI、I2C、PWM等等。编写LL程通常相对比较繁琐,需要同时考虑寄存器地址、位操作和控制失误等因素,但是相对的,也能更加灵活地控制整个外设,从而实现更加高效和精确的控制。 总之,无论是初学者还是专业人士,在STM32G070的开发中都需要掌握LL程的使用方法和技巧,以充分发挥该微控制器的潜力,并实现自己的设计和应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值