s3c2410+linux通过SPI驱动双数码管参考代码
学习了一段时间的嵌入式系统了,感觉它的复杂就体现在要和硬件打交道并且还要在操作系统中控制硬件。开发板上有一个实例,我把它改了一下便于理解,以作为以后学习的参考。
本人描述能力差,还是直接上图和代码吧。
硬件原理图:

驱动代码:
/*
*************magic_leds.c*******************
* s3c2410+linux 2.6.24.4通过SPI控制双数码管显示的驱动程序参考代码
*/#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include #define SPI_MAJORE 25#define DEVICE_NAME "S3C2410_SPI0"
struct class *leds_class;
struct cdev dev;
#define rSPCON0 ((volatile unsigned long *)r_SPCON0)
#define rSPSTA0 ((volatile unsigned long *)r_SPSTA0)
#define rSPPIN0 ((volatile unsigned long *)r_SPPIN0)
#define rSPPRE0 ((volatile unsigned long *)r_SPPRE0)
#define rSPTDAT0 ((volatile unsigned long *)r_SPTDAT0)
#define rSPRDAT0 ((volatile unsigned long *)r_SPRDAT0) #define rCLKCON ((volatile unsigned long *)r_CLKCON)unsigned long *r_SPCON0,*r_SPSTA0,*r_SPPIN0,*r_SPPRE0,*r_SPTDAT0,*r_SPRDAT0,*r_CLKCON;int address_map(void)
{//将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问;r_CLKCON = ioremap(0x4C00000c,4); //从s3c2410芯片手册中知道,这映射的是“时钟产生控制寄存器”的地址r_SPCON0 = ioremap(0x59000000,4); //映射的是“SPI channel 0 control register”,串行外部接口通道0控制寄存器r_SPSTA0 = ioremap(0x59000004,4); //映射的是“SPI channel 0 status register”,串行外部接口通道0状态寄存器r_SPPRE0 = ioremap(0x5900000c,4); //映射的是“SPI cannel 0 baud rate prescaler register”,串行外部接口通道0波特率分频寄存器r_SPTDAT0 = ioremap(0x59000010,4); //映射的是“SPI channel 0 Tx data register”,串行外部接口通道0传送数据寄存器r_SPRDAT0 = ioremap(0x59000014,4); //映射的是“SPI channel 0 Rx data register”,串行外部接口通道0接收数据寄存器return 0;
}static ssize_t spi_open(struct inode *inode, struct file *file)
{unsigned long temp; s3c2410_gpio_cfgpin(S3C2410_GPH0,S3C2410_GPH0_OUTP); s3c2410_gpio_pullup(S3C2410_GPH0, 0);temp = __raw_readl(rCLKCON);temp |= 0x40000; //根据s3c2410芯片手册可以知道,这是设置“Control PCLK into SPI block.”__raw_writel(temp,rCLKCON);__raw_writel(0x0d,rSPPRE0); //根据s3c2410芯片手册可以知道,这是设置Prescaler Value,“Determine SPI clock rate as above equation. Baud rate = PCLK / 2 / (Prescaler value + 1)”__raw_writel(0x19,rSPCON0); //查看芯片手册可知,这是在设置I2C的时钟可用,设置USB为master端return 0;
}static ssize_t spi_release(struct inode *inode, struct file *file)
{printk("it has been released!\n");return 0;
}static ssize_t spi_read(struct file *file, char __user *buffer, long count, loff_t *ppos)
{ printk("it is reading from pin!\n");return 1;
}static ssize_t spi_write(struct file *file, const char __user *buffer, long count, loff_t *ppos)
{int i;unsigned char ptr[count];printk("start writing!\n");if (copy_from_user(ptr, buffer, count))return -EFAULT;s3c2410_gpio_setpin(S3C2410_GPH0,0); for(i=0;i
测试代码:
/*
************magicleds_test.c******************
*双数码管显示的测试代码
*/#include
#include
#include
#include
//#include
int MAX_LEN=255;
int main()
{int fd;int i;char c,sc;unsigned char buf1[32]={0xc0,0xc0,0xf9,0xf9,0xa4,0xa4,0xb0,0xb0,0x99,0x99,0x92,0x92,0x82,0x82,0xf8,0xf8,0x80,0x80,0x90,0x90,0x88,0x88,0x83,0x83,0xc6,0xc6,0xa1,0xa1,0x86,0x86,0x8e,0x8e,};unsigned char buf[2]={0xff,0xff};fd=open("/dev/S3C2410_SPI0",O_RDWR);if(fd < 0){printf("####spi device open fail####\n");return (-1);}write(fd,&buf,2); //将buf中的两个字节写入到fd对应的文件中while(1)for(i=0;i<32;){write(fd,buf1+i,2);sleep(1);write(fd,buf,2);i=i+2;}close(fd);return 0;}
运行过程控制台截图:

由于本人菜鸟一个,错误之处在所难免,欢迎指正。
(---------------------完----------------------)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
