linux下spi测试程序,Linux下SPI测试程序

Linux下SPI测试程序

(2016-11-14 19:47:36)

Linux下SPI测试程序

2015-03-21

19:31:26来源:优快云作者:wjs1033

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "Debug.h"

#define SPI_DEBUG 0

static const char *device = "/dev/spidev0.0";

static uint8_t mode = 0;

static uint8_t bits = 8;

static uint32_t speed = 12 * 1000 * 1000;

static uint16_t delay = 0;

static int g_SPI_Fd = 0;

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)

pr_err("can't send spi message");

else

{

#if SPI_DEBUG

int i;

pr_debug("nsend spi message Succeed");

pr_debug("nSPI Send [Len:%d]: ", len);

for (i = 0; i < len; i++)

{

if (i % 8 == 0)

printf("nt");

printf("0xX ", TxBuf[i]);

}

printf("n");

pr_debug("SPI Receive [len:%d]:", len);

for (i = 0; i < len; i++)

{

if (i % 8 == 0)

printf("nt");

printf("0xX ", RxBuf[i]);

}

printf("n");

#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)

pr_err("SPI Write errorn");

else

{

#if SPI_DEBUG

int i;

pr_debug("nSPI Write [Len:%d]: ", len);

for (i = 0; i < len; i++)

{

if (i % 8 == 0)

printf("nt");

printf("0xX ", 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)

pr_err("SPI Read errorn");

else

{

#if SPI_DEBUG

int i;

pr_debug("SPI Read [len:%d]:", len);

for (i = 0; i < len; i++)

{

if (i % 8 == 0)

printf("nt");

printf("0xX ", 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");

else

pr_debug("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");

ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);

if (ret == -1)

pabort("can't get spi mode");

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");

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");

pr_debug("spi mode: %dn", mode);

pr_debug("bits per word: %dn", bits);

pr_debug("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)

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;

pr_debug("nSPI - LookBack Mode Test...n");

ret = SPI_Transfer(tx, rx, BufSize);

if (ret > 1)

{

ret = memcmp(tx, rx, BufSize);

if (ret != 0)

{

pr_err("LookBack Mode Test errorn");

//pabort("error");

}

else

pr_debug("SPI - LookBack Mode OKn");

}

return ret;

}

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值