下面是基于linux2.6.30实现的spi驱动的应用层测试程序:
-
#include <stdio.h>
-
#include <stdint.h>
-
#include <string.h>
-
#include <fcntl.h>
-
#include <sys/ioctl.h>
-
#include <linux/types.h>
-
#include <linux/spi/spidev.h>
-
-
#define SPI_DEVICE "/dev/spidev1.0"
-
-
//fm25L256 cmd
-
#define FM_OPT_WREN 0x06
-
#define FM_OPT_WRDI 0x04
-
#define FM_OPT_RDSR 0x05
-
#define FM_OPT_WRSR 0x01
-
#define FM_OPT_ERAD 0x03
-
#define FM_OPT_WRIT 0x02
-
-
//fm25l256 para
-
#define FM_ADDR_MAX 0x7fff
-
#define FM_MODE SPI_MODE_0
-
#define FM_BITS 8
-
#define FM_FREQ_MAX 50000000
-
#define FM_OPT_ADDR 0x0
-
-
static uint8_t gMode = FM_MODE;
-
static uint8_t gBits = FM_BITS;
-
static uint32_t gSpeed = FM_FREQ_MAX;
-
static uint16_t gOptAddr = FM_OPT_ADDR;
-
uint8_t gLsb;
-
static int spi_write_read(int fd, const uint8_t *wbuf, int wlen, uint8_t *rbuf, int rlen){
-
int ret = 0;
-
struct spi_ioc_transfer tr[2] = {
-
{
-
.tx_buf = (unsigned long)wbuf,
-
.rx_buf = 0,
-
.len = wlen,
-
.speed_hz = 5000000,
-
},
-
{
-
.tx_buf = 0,
-
.rx_buf = (unsigned long)rbuf,
-
.len = rlen,
-
.speed_hz = 5000000,
-
},
-
};
-
-
ret = ioctl(fd, SPI_IOC_MESSAGE(2), tr);
-
return ret;
-
}
-
-
static int spi_write_only(int fd, const uint8_t *wbuf, int wlen, uint8_t *rbuf, int rlen){
-
int ret = 0;
-
struct spi_ioc_transfer tr[1] = {
-
{
-
.tx_buf = (unsigned long)wbuf,
-
.rx_buf = 0,
-
.len = wlen,
-
.speed_hz = 5000000,
-
},
-
};
-
-
ret = ioctl(fd, SPI_IOC_MESSAGE(1), tr);
-
return ret;
-
}
-
int main(int argc, char *argv[]){
-
int fd;
-
int index;
-
int optSize;
-
int ret;
-
int i;
-
int tmpSize;
-
uint8_t rdBuf[128];
-
uint8_t wrBuf[128];
-
uint8_t cmd;
-
-
if(argc != 2){
-
printf("argc error.\n");
-
return -1;
-
}
-
-
tmpSize = atoi(argv[1]);
-
-
fd = open(SPI_DEVICE, O_RDWR);
-
if(fd < 0){
-
printf("open spi file error.\n");
-
return -1;
-
}
-
-
//mode
-
ret = ioctl(fd, SPI_IOC_WR_MODE, &gMode);
-
if(ret < 0){
-
printf("set wr mode error.\n");
-
close(fd);
-
return -1;
-
}
-
-
//bits
-
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &gBits);
-
if(ret < 0){
-
printf("set bits error.\n");
-
close(fd);
-
return -1;
-
}
-
-
//speed
-
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &gSpeed);
-
if(ret < 0){
-
printf("set speed error.\n");
-
close(fd);
-
return -1;
-
}
-
-
//get mode
-
ret = ioctl(fd, SPI_IOC_RD_MODE, &gMode);
-
printf("FM Mode: %d.\n",gMode);
-
-
//get bits
-
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &gBits);
-
printf("FM bits:%d.\n", gBits);
-
-
//get speed
-
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &gSpeed);
-
printf("FM speed:%d.\n", gSpeed);
-
-
//get lsb
-
ret = ioctl(fd, SPI_IOC_RD_LSB_FIRST, &gLsb);
-
printf("FM lsb:%d.\n", gLsb);
-
-
#if 0 //---------------------- method 1 ----------------------------
-
cmd = FM_OPT_WREN;
-
ret = write(fd, &cmd, sizeof(cmd));
-
if(ret < 0 )
-
printf("write wren error.err = %d\n", ret);
-
else
-
printf("write wren ok.\n");
-
-
-
index = 0;
-
wrBuf[index++] = FM_OPT_WRIT;
-
wrBuf[index++] = (gOptAddr>>8)&0xff;
-
wrBuf[index++] = (gOptAddr>>0)&0xff;
-
-
srand((unsigned)time(NULL));
-
printf("write data = \n");
-
-
-
if(tmpSize){
-
for(i = 0; i < tmpSize; i++){
-
rdBuf[i] = 1 + rand()%100+1;
-
printf("%02x ", rdBuf[i]);
-
}
-
}
-
else{
-
tmpSize = 128;
-
for(i = 0; i < tmpSize; i++){
-
rdBuf[i] = 0;
-
printf("%02x ", rdBuf[i]);
-
}
-
}
-
printf("\n");
-
-
memcpy(&wrBuf[index], rdBuf,tmpSize);
-
index += tmpSize;
-
optSize = index;
-
//ret = spi_write_read(fd, wrBuf, optSize, 0, 0);
-
ret = spi_write_only(fd, wrBuf,optSize, 0, 0);
-
if(ret < 0)
-
printf("write error,err = %d\n", ret);
-
else
-
printf("write ok.ret = %d\n", ret);
-
-
memset(rdBuf, 0, sizeof(rdBuf));
-
cmd = FM_OPT_ERAD;
-
index = 0;
-
wrBuf[index++] = cmd;
-
wrBuf[index++] = (gOptAddr>>8)&0xff;
-
wrBuf[index++] = (gOptAddr>>0)&0xff;
-
ret = spi_write_read(fd, wrBuf, index, rdBuf, sizeof(rdBuf));
-
if(ret < 0){
-
printf("read error, err = %d\n", ret);
-
}
-
else{
-
printf("read ok.ret = %d, data = \n", ret);
-
for(index = 0; index < sizeof(rdBuf); index++){
-
printf("%02x ", rdBuf[index]);
-
}
-
printf("\n");
-
}
-
#endif //endof method 1 ------------------------------
-
-
#if 1
-
//**************** method 2 *******************
-
cmd = FM_OPT_WREN;
-
ret = write(fd, &cmd, sizeof(cmd));
-
if(ret < 0 )
-
printf("write wren error.err = %d\n", ret);
-
else
-
printf("write wren ok.\n");
-
-
-
index = 0;
-
//wrBuf[index++] = FM_OPT_WREN; //fail
-
wrBuf[index++] = FM_OPT_WRIT;
-
wrBuf[index++] = (gOptAddr>>8)&0xff;
-
wrBuf[index++] = (gOptAddr>>0)&0xff;
-
-
srand((unsigned)time(NULL));
-
printf("write data = \n");
-
-
-
if(tmpSize){
-
for(i = 0; i < tmpSize; i++){
-
rdBuf[i] = 1 + rand()%100+1;
-
printf("%02x ", rdBuf[i]);
-
}
-
}
-
else{
-
tmpSize = 128;
-
for(i = 0; i < tmpSize; i++){
-
rdBuf[i] = 0;
-
printf("%02x ", rdBuf[i]);
-
}
-
}
-
printf("\n");
-
-
memcpy(&wrBuf[index], rdBuf,tmpSize);
-
index += tmpSize;
-
-
ret = write(fd, wrBuf, index);
-
if(ret < 0 )
-
printf("write error.err = %d\n", ret);
-
else
-
printf("write ok.ret = %d\n", ret);
-
-
memset(rdBuf, 0, sizeof(rdBuf));
-
index = 0;
-
wrBuf[index++] = FM_OPT_ERAD;
-
wrBuf[index++] = (gOptAddr>>8)&0xff;
-
wrBuf[index++] = (gOptAddr>>0)&0xff;
-
-
ret = spi_write_read(fd, wrBuf, index, rdBuf, sizeof(rdBuf));
-
if(ret < 0 )
-
printf("read error.err = %d\n", ret);
-
else
-
printf("read ok.ret = %d\n", ret);
-
#if 0 //-- fail
-
ret = write(fd, wrBuf, index);
-
ret = read(fd, rdBuf, 100);
-
if(ret < 0 )
-
printf("read error.err = %d\n", ret);
-
else
-
printf("read wren ok.ret = %d\n", ret);
-
#endif
-
-
-
printf("data = \n");
-
for(index = 0; index < sizeof(rdBuf); index++){
-
printf("%02x ", rdBuf[index]);
-
}
-
printf("\n");
-
#endif
-
//********************************************************************************/
-
-
close(fd);
-
return 0;
-
}
阅读(2540) | 评论(0) | 转发(0) |