福州网站公司,做网站有什么好处吗,专业做生鲜的网站,内江网络推广公司版权所有#xff0c;转载请说明转自原创作者#xff1a;南京邮电大学 通信与信息系统专业 研二 魏清五#xff0e;SPI测试代码对于SPI总线驱动#xff0c;我们可以分为SPI控制设备驱动和SPI接口设备驱动。而作为驱动开发人员主要是像SPI移植的时候一样会添加SPI控制设备和…版权所有转载请说明转自原创作者南京邮电大学 通信与信息系统专业 研二 魏清五SPI测试代码对于SPI总线驱动我们可以分为SPI控制设备驱动和SPI接口设备驱动。而作为驱动开发人员主要是像SPI移植的时候一样会添加SPI控制设备和SPI接口设备的私有数据同时驱动开发人员还需要会开发SPI接口设备驱动而我们这个SPI测试实验中我们使用的是内核自带的SPI接口设备驱动代码spidev.c。我们也对内核给的SPI测试代码spidev_test.c进行了修改。同时我们利用mini2440自带的两个SPI接口(spi0和spi1)测试过程中我们只使用spi1根据查找datesheet我们知道spi1的SPIMISO1是GPG5也就是CON4的19引脚。spi1的SPIMOSI1是GPG6也就是CON4的20引脚。所以我们这个应用层测试代码采用自发自收方式所以需要将CON4的19引脚和CON4的20引脚短接。实验环境内核linux2.6.32.2arm-linux-gcc交叉编译器mini2440开发板。内核配置配置时候我们需要选中spi.c spi_gpio.c spi_s3c24xx.c spi_bitbang.c spi_s3c24xx_gpio.cspidev.c文件具体测试代码如下#include#include#include#include#include#include#include#include#include#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))static void pabort(const char *s){perror(s);abort();}static const char *device /dev/spidev1.0;//设备名static uint8_t mode;static uint8_t bits 8;static uint32_t speed 500000;static uint16_t delay;static void transfer(int fd){int ret;uint8_t tx[] { //定义待发送的数据0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0x40, 0x00, 0x00, 0x00, 0x00, 0x95,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,0xF0, 0x0D,};uint8_t rx[ARRAY_SIZE(tx)] {0, };struct spi_ioc_transfer tr {.tx_buf (unsigned long)tx, //定义发送缓冲区指针.rx_buf (unsigned long)rx, //定义接收缓冲区指针.len ARRAY_SIZE(tx),.delay_usecs delay,.speed_hz speed,.bits_per_word bits,};ret ioctl(fd, SPI_IOC_MESSAGE(1), tr);//执行spidev.c中ioctl的default进行数据传输if (ret 1)pabort(cant send spi message);for (ret 0; ret ARRAY_SIZE(tx); ret) {if (!(ret % 6))puts();printf(%.2X , rx[ret]); //打印接收到的数据}puts();}int main(int argc, char *argv[]){int ret 0;int fd;mode | SPI_CPHA;mode | SPI_CPOL;mode ~SPI_CS_HIGH;fd open(device, O_RDWR); //打开/dev/spidev1.0if (fd 0)pabort(cant open device);ret ioctl(fd, SPI_IOC_WR_MODE, mode); //SPI模式设置可写if (ret -1)pabort(cant set spi mode);ret ioctl(fd, SPI_IOC_RD_MODE, mode); //SPI模式设置可读if (ret -1)pabort(cant get spi mode);ret ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, bits); //SPI的bit/word设置可写if (ret -1)pabort(cant set bits per word);ret ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, bits); //SPI的bit/word设置可读if (ret -1)pabort(cant get bits per word);ret ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, speed); //SPI的波特率设置可写if (ret -1)pabort(cant set max speed hz);ret ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, speed); //SPI的波特率设置可读if (ret -1)pabort(cant get max speed hz);printf(spi mode: %d\n, mode);printf(bits per word: %d\n, bits);printf(max speed: %d Hz (%d KHz)\n, speed, speed/1000);transfer(fd); //数据传输close(fd);return ret;}测试结果虚拟机下编译arm-linux-gcc spi_test.c -o spi_test在超级终端下运行./spi_test可以见到0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0x40, 0x00, 0x00, 0x00, 0x00, 0x95,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,0xF0, 0x0D,