开发板默认配置好了SPI。我们可以通过回环测试,确定SPI是否能正常使用。
使用spi_test.c做回环(短接MISO和MOSI)测试。
使用跳线帽短接GPIO10–GPIO11(短接MISO和MOSI)进行回环测试。
spi_test.c源码
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <strings.h>
#include <string.h>
#include "../../project/kbuild/4.9.84/i2m/include/uapi/linux/spi/spidev.h"
static const char *device = "/dev/spidev0.0";
static uint8_t mode = 0; /* SPI 通信使用全双工,设置 CPOL=0,CPHA=0。 */
static uint8_t bits = 8; /* 8bits读写,MSB first。*/
static uint32_t speed = 12*1000*1000;/* 设置传输速度 */
static uint16_t delay = 0;
static int g_SPI_Fd = 0;
#define SPI_DEBUG 1
static void pabort(const char *s)
{
perror(s);
abort();
}
int SPI_Transfer(const uint8_t *TxBuf, uint8_t *RxBuf, int len)
{
int ret;
int fd = g_SPI_Fd;
struct spi_ioc_transfer tr ={
.tx_buf = (unsigned long) TxBuf,
.rx_buf = (unsigned long) RxBuf,
.len =len,
.delay_usecs = delay,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
perror("can't send spi message\n");
else
{
#if SPI_DEBUG
int i;
printf("nsend spi message Succeed\n");
printf("nSPI Send [Len:%d]: \n", len);
for (i = 0; i < len; i++)
{
if (i % 8 == 0)
printf("nt\n");
printf("0x%02X \n", TxBuf[i]);
}
printf("n");
printf("SPI Receive [len:%d]:\n", len);
for (i = 0; i < len; i++)
{
if (i % 8 == 0)
printf("nt\n");
printf("0x%02X \n", RxBuf[i]);
}
#endif
}
return ret;
}
int SPI_Write(uint8_t *TxBuf, int len)
{
int ret;
int fd = g_SPI_Fd;
ret = write(fd, TxBuf, len);
if (ret < 0)
perror("SPI Write error\n");
else
{
#if SPI_DEBUG
int i;
printf("SPI Write [Len:%d]: \n", len);
for (i = 0; i < len; i++)
{
if (i % 8 == 0)
printf("\n\t");
printf("0x%02X \n", TxBuf[i]);
}
printf("\n");
#endif
}
return ret;
}
int SPI_Read(uint8_t *RxBuf, int len)
{
int ret;
int fd = g_SPI_Fd;
ret = read(fd, RxBuf, len);
if (ret < 0)
printf("SPI Read error\n");
else
{
#if SPI_DEBUG
int i;
printf("SPI Read [len:%d]:\n", len);
for (i = 0; i < len; i++)
{
if (i % 8 == 0)
printf("\n\t");
printf("0x%02X \n", RxBuf[i]);
}
printf("\n");
#endif
}
return ret;
}
int SPI_Open(void)
{
int fd;
int ret = 0;
if (g_SPI_Fd != 0) /* 设备已打开 */
return 0xF1;
fd = open(device, O_RDWR);
if (fd < 0)
pabort("can't open device\n");
else
printf("SPI - Open Succeed. Start Init SPI...\n");
g_SPI_Fd = fd;
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -1)
pabort("can't set spi mode\n");
ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
if (ret == -1)
pabort("can't get spi mode\n");
/*
* bits per word
*/
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1)
pabort("can't set bits per word\n");
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -1)
pabort("can't get bits per word\n");
/*
* max speed hz
*/
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1)
pabort("can't set max speed hz\n");
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -1)
pabort("can't get max speed hz\n");
printf("spi mode: %d\n", mode);
printf("bits per word: %d\n", bits);
printf("max speed: %d KHz (%d MHz)\n", speed / 1000, speed / 1000 / 1000);
return ret;
}
int SPI_Close(void)
{
int fd = g_SPI_Fd;
if (fd == 0) /* SPI 是否已经打开*/
return 0;
close(fd);
g_SPI_Fd = 0;
return 0;
}
int SPI_LookBackTest(void)
{
int ret, i;
const int BufSize = 16;
uint8_t tx[BufSize], rx[BufSize];
bzero(rx, sizeof(rx));
for (i = 0; i < BufSize; i++)
tx[i] = i;
printf("nSPI - LookBack Mode Test...\n");
ret = SPI_Transfer(tx, rx, BufSize);
if (ret > 1)
{
ret = memcmp(tx, rx, BufSize);
if (ret != 0)
{
printf("tx:\n");
for (i = 0; i < BufSize; i++)
{
printf("%d ", tx[i]);
}
printf("\n");
printf("rx:\n");
for (i = 0; i < BufSize; i++)
{
printf("%d ", rx[i]);
}
printf("\n");
perror("LookBack Mode Test error\n");
}
else
printf("SPI - LookBack Mode OK\n");
}
return ret;
}
int main(void)
{
int ret;
ret = SPI_Open();
printf("************************* ret = %d***********************\n", ret);
//unsigned char buf[3] = {0xf3, 0x76, 0x59};
//SPI_Write(buf, 3);
SPI_LookBackTest();
SPI_Close();
return 0;
}
将源码拷贝到Ubuntu,下进行编译,生成执行文件spi_test。
#arm-linux-gnueabihf-gcc spi_test.c -o spi_test -lpthread
编译spi_test.c得到spi_test,将spi_test拷贝到开发板并执行。
# ./spi_test
spi测试ok
文档更新时间: 2022-06-23 16:35 作者:Aeeditor