嵌入式linux FM25L256的驱动(应用层)程序

2019-07-13 00:46发布

 上面是基于linux2.6.30实现的spi驱动的应用层测试程序: #include #include #include #include #include #include #include #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. "); return -1; } tmpSize = atoi(argv[1]); fd = open(SPI_DEVICE, O_RDWR); if(fd < 0){ printf("open spi file error. "); return -1; } //mode ret = ioctl(fd, SPI_IOC_WR_MODE, &gMode); if(ret < 0){ printf("set wr mode error. "); close(fd); return -1; } //bits ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &gBits); if(ret < 0){ printf("set bits error. "); close(fd); return -1; } //speed ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &gSpeed); if(ret < 0){ printf("set speed error. "); close(fd); return -1; } //get mode ret = ioctl(fd, SPI_IOC_RD_MODE, &gMode); printf("FM Mode: %d. ",gMode); //get bits ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &gBits); printf("FM bits:%d. ", gBits); //get speed ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &gSpeed); printf("FM speed:%d. ", gSpeed); //get lsb ret = ioctl(fd, SPI_IOC_RD_LSB_FIRST, &gLsb); printf("FM lsb:%d. ", gLsb); #if 0 //---------------------- method 1 ---------------------------- cmd = FM_OPT_WREN; ret = write(fd, &cmd, sizeof(cmd)); if(ret < 0 ) printf("write wren error.err = %d ", ret); else printf("write wren ok. "); index = 0; wrBuf[index++] = FM_OPT_WRIT; wrBuf[index++] = (gOptAddr>>8)&0xff; wrBuf[index++] = (gOptAddr>>0)&0xff; srand((unsigned)time(NULL)); printf("write data = "); 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(" "); 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 ", ret); else printf("write ok.ret = %d ", 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 ", ret); } else{ printf("read ok.ret = %d, data = ", ret); for(index = 0; index < sizeof(rdBuf); index++){ printf("%02x ", rdBuf[index]); } printf(" "); } #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 ", ret); else printf("write wren ok. "); 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 = "); 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(" "); memcpy(&wrBuf[index], rdBuf,tmpSize); index += tmpSize; ret = write(fd, wrBuf, index); if(ret < 0 ) printf("write error.err = %d ", ret); else printf("write ok.ret = %d ", 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 ", ret); else printf("read ok.ret = %d ", ret); #if 0 //-- fail ret = write(fd, wrBuf, index); ret = read(fd, rdBuf, 100); if(ret < 0 ) printf("read error.err = %d ", ret); else printf("read wren ok.ret = %d ", ret); #endif printf("data = "); for(index = 0; index < sizeof(rdBuf); index++){ printf("%02x ", rdBuf[index]); } printf(" "); #endif //********************************************************************************/ close(fd); return 0; }