微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > linux spi 从机驱动 读到的数据是乱码?请问怎么解决?!

linux spi 从机驱动 读到的数据是乱码?请问怎么解决?!

时间:10-02 整理:3721RD 点击:

  1.                
  2. static struct class *spi_class;
  3. static struct cdev spicdev;
  4. dev_t devno;
  5. /*****************************************************/
  6. volatile unsigned long *spi_gpecon=NULL;
  7. volatile unsigned long *spi_gpedat=NULL;
  8. volatile unsigned long *spi_gpeup=NULL;
  9. volatile unsigned long *spi_gpgcon=NULL;
  10. volatile unsigned long *spi_gpgdat=NULL;
  11. volatile unsigned long *spi_gpgup=NULL;
  12. volatile unsigned long *s3c2440_clkcon;
  13. volatile unsigned long *spi_spcon0;
  14. volatile unsigned long *spi_spsta0;
  15. volatile unsigned long *spi_sppin0;
  16. volatile unsigned long *spi_sppre0;
  17. volatile unsigned long *spi_sptdat0;
  18. volatile unsigned long *spi_sprdat0;
  19. #define SPI_TXRX_READY      (((*spi_spsta0)&0x1) == 0x1)
  20. #define SPI_CS               (((*spi_gpgdat)&0x4)==0x01)


  21. /***********nSS_SPI GPG2                SPICLK  GPE13        -26
  22.                         SPIMOSI GPE12-25        SPIMISO GPE11-24************/
  23. static int spi_open(struct inode *inode,struct file *filp)
  24. {

  25.         *s3c2440_clkcon |=0x40000;//使能SPI
  26.        
  27.         *spi_gpecon &=0xF03FFFF;//配置SPI
  28.     *spi_gpecon |=0xA800000;//
  29.    // *spi_gpeup &=0xc7ff;//使能上拉电阻
  30.    
  31.         *spi_gpgcon|=(3<<4);//配置nSS0
  32.     //*spi_gpgup &= 0xFB;
  33.        
  34.         *spi_sppre0=0x06;    //  > 5M
  35.         *spi_spcon0=(0<<6)|(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(1<<0);
  36.         printk("spi_spcon0=%02X\n",(unsigned int)*spi_spcon0);       
  37.         *spi_sppin0=(0<<2)|(0<<0);
  38.         printk("spi_sppin0=%02X\n",(unsigned int)*spi_sppin0);
  39.         return 0;
  40. }
  41.   
  42.   

  43.   
  44. static ssize_t spi_read(struct file *filp,char __user *buf,size_t count,loff_t *f_ops)
  45. {

  46.     char ch;
  47.     while(!SPI_TXRX_READY);   
  48.     ch= (char)*spi_sprdat0;
  49.     copy_to_user(buf,&ch,1);
  50.     return 1;
  51. }
  52. static int spi_release(struct inode *inode,struct file *filp)
  53. {
  54.    
  55.     printk("<1>release\n");
  56.     return 0;
  57. }

  58. static ssize_t spi_write(struct file *filp,const char __user *buf,size_t count,loff_t *f_ops)
  59. {
  60.         return 0;
  61. }
  62. static ssize_t spi_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long data)
  63. {
  64.     return 0;
  65. }

  66. static struct file_operations spi_drv_fops = {
  67.          .owner=THIS_MODULE,
  68.          .open=spi_open,
  69.          .read=spi_read,
  70.          .ioctl=spi_ioctl,
  71.          .release=spi_release,
  72.          .write=spi_write,
  73. };
  74. static int __init spi_init(void)
  75. {

  76.         int result;
  77.     result = alloc_chrdev_region(&devno, 0, 1, "spi_drv");
  78.         if (result < 0)
  79.         return result;
  80.         cdev_init(&spicdev, &spi_drv_fops);
  81.         spicdev.owner = THIS_MODULE;
  82.         spicdev.ops = &spi_drv_fops;
  83.         cdev_add(&spicdev, devno, 1);
  84.         spi_class = class_create(THIS_MODULE, "spi_drv");
  85.         device_create(spi_class, NULL, devno, NULL, "S3C2440_SPI"); /* /dev/S3C2440_SPI */
  86.                                
  87.         s3c2440_clkcon         = (volatile unsigned long *)ioremap(0x4C00000c,3);
  88.        
  89.         spi_gpgcon = (volatile unsigned long *)ioremap (0x56000060,4);
  90.         spi_gpgdat = (volatile unsigned long *)ioremap (0x56000064,2);
  91.         spi_gpgup = (volatile unsigned long *)ioremap (0x56000068,2);

  92.         spi_gpecon = (volatile unsigned long *)ioremap (0x56000040,2);
  93.         spi_gpedat = (volatile unsigned long *)ioremap (0x56000044,1);
  94.         spi_gpeup = (volatile unsigned long *)ioremap (0x56000048,1);

  95.     spi_spcon0 = (volatile unsigned long *)ioremap(0x59000000,1);
  96.     spi_spsta0 = (volatile unsigned long *)ioremap(0x59000004,1);
  97.     spi_sppin0 = (volatile unsigned long *)ioremap(0x59000008,1);
  98.     spi_sppre0 = (volatile unsigned long *)ioremap(0x5900000c,1);
  99.     spi_sptdat0 = (volatile unsigned long *)ioremap(0x59000010,1);
  100.     spi_sprdat0 = (volatile unsigned long *)ioremap(0x59000014,1);
  101.        
  102.     printk("Init spi success!\n");  
  103.     return result;
  104. }
  105. static void __exit spi_exit(void)
  106. {
  107.     cdev_del(&spicdev);   
  108.         unregister_chrdev_region(devno, 1);
  109.         device_destroy(spi_class,devno);
  110.         class_destroy(spi_class);
  111.         iounmap(s3c2440_clkcon);
  112.         iounmap(spi_gpgcon);
  113.         iounmap(spi_gpgdat);
  114.         iounmap(spi_gpgup);
  115.         iounmap(spi_gpecon);
  116.         iounmap(spi_gpedat);
  117.         iounmap(spi_gpeup);
  118.         iounmap(spi_spcon0);
  119.         iounmap(spi_spsta0);
  120.         iounmap(spi_sppin0);
  121.         iounmap(spi_sppre0);
  122.         iounmap(spi_sptdat0);
  123.         iounmap(spi_sprdat0);
  124.     printk("<1>spi_exit!\n");
  125. }
  126. module_init(spi_init);
  127. module_exit(spi_exit);

复制代码

建议看一下初始化有没有问题

1111111111111111111111111111111111111111111111111111

我现在也在写一个SPI 从机驱动,小编的代码有很很好的启示

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top