CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 6161|回复: 2

求助: SPI MOSI 无输出 SCLK 无时钟 --直接写寄存器

[复制链接]
发表于 2014-1-16 16:06:28 | 显示全部楼层 |阅读模式
本帖最后由 wolf 于 2014-1-16 16:39 编辑

开发板 : Cubie2
linux内核: linux 3.4
android : 4.2

问题:设置好 fex 和 config后, 我自己写了个spi设备驱动,  由于手头有一个驱动原形, 就没有参照内核带的spidev的驱动. 现在情况是 :能够正确的读写寄存器, 但是在gpio上却没有 数据输出,也没有时钟.控制片选倒是高低电平能够通过示波器测量到.

请各位大神帮忙看看, 问题到底出在哪里了...

--------------------------------------------------------------------------------
内核 .config部分

  1. 1456 CONFIG_SPI_SUN7I=y
  2. 1457 CONFIG_SPI=y
  3. 1458 CONFIG_SPI_MASTER=y                                                                                                                 
  4. 1460 CONFIG_EXPERIMENTAL=y
复制代码
___________________________________________________
system.fex 部分
  1. 256 [spi0_para]
  2. 257 spi_used            = 1
  3. 258 spi_cs_bitmap       = 1
  4. 259 spi_cs0             = port:PI10<2><default><default><default>                                                                             
  5. 260 spi_sclk            = port:PI11<2><default><default><default>
  6. 261 spi_mosi            = port:PI12<2><default><default><default>
  7. 262 spi_miso            = port:PI13<2><default><default><default>
  8. 294 [spi_devices]
  9. 295 spi_dev_num = 1
  10. 296
  11. 297 [spi_board0]
  12. 298 modalias = "ads1298"
  13. 299 max_speed_hz = 12000000
  14. 300 bus_num = 0
  15. 301 chip_select = 0
  16. 302 mode = 0
  17. 303 full_duplex = 0
  18. 304 manual_cs = 0
复制代码
__________________________________________________________________
GPIO 设置
  1. 491 static void pio_init(void)
  2. 492 {
  3. 493     u32 regVal;   
  4. 494     volatile void __iomem *pig_cfg1_v;
  5. 495
  6. 496     pig_cfg1_v = ioremap(PI_CFG1,4);//used const u32 PI_CFG1
  7. 499     regVal = readl(pig_cfg1_v);
  8. 501
  9. 502     /*
  10. 503      * config PI10 - PI15 register
  11. 504      * | 31 |  30  |  29  |  28  |  27 |   26  |  25  |  24  | 23 |  22 |  21 | 20 |  19  |  18  |  17  |  16  |
  12. 505      * | /  |      pwm 1mv       |  /  |Drdy EINT26/input?000| /  |     MISO       |  /   |      MOSI          |
  13. 506      * | /  |   0  |  0   |  0   |  /  |   1   |  1   |  0   | /  |  0  |  1  |  0 |  /   |  0   |  1   |  0   |
  14. 507      *
  15. 508      * | 15 |  14  |  13  |  12  |  11  |  10  |  9  |  8  |  7 - 0  |
  16. 509      * | /  |       CLK          |  /   |        CS0       |    -    |
  17. 510      * | /  |   0  |  1   |   0  |  /   |   0  |  1  |  0  |    -    |
  18. 511      */
  19. 512
  20. 513     /* PI10-PI15 */
  21. 514     regVal &= 0x000000FF;  
  22. 515     regVal |= 0x06222200;  
  23. 516     writel(regVal, pig_cfg1_v);
  24. 519 }
复制代码
___________________________________________________________________
spi 寄存器 初始化
  1. static void spi_init(void)                                                                                                                 
  2. 419 {
  3. 420     //u32 mr;
  4. 421     volatile u32 regVal;
  5. 422     void __iomem *cpu_ahb_apb0_cfg_reg_v;
  6. 423     void __iomem *ahb_gating_reg0_v;
  7. 424     void __iomem *spi0_clk_v;
  8. 425     int i;
  9. 426

  10. 428     //spi0_CLK
  11. 430     regVal = 0x80030000; //osc/8/1 = 3M sclk=3M
  12. 431     spi0_clk_v = ioremap(SPI0_CLK, 4);
  13. 432     writel(regVal, spi0_clk_v);

  14. 436     /* AHB setting */
  15. 437     cpu_ahb_apb0_cfg_reg_v = ioremap(CPU_AHB_APB0_CFG_REG, 4);
  16. 438     regVal = readl(cpu_ahb_apb0_cfg_reg_v );
  17. 439     regVal&= 0xFFFFFF0F; //set default AHB val
  18. 441     regVal|= (0x01 << 6); //pll6/2 = 300M
  19. 442     writel(regVal, cpu_ahb_apb0_cfg_reg_v);
  20. 445     iounmap(cpu_ahb_apb0_cfg_reg_v);
  21. 446
  22. 447     ahb_gating_reg0_v = ioremap(AHB_GATING_REG0,4);
  23. 448     regVal = readl(ahb_gating_reg0_v);
  24. 450     regVal |= (0x01 << 20); // set gating pass
  25. 451     regVal |= (0x01 << 6); // set gating pass for dma , 好像没用.
  26. 453     writel(regVal, ahb_gating_reg0_v);
  27. 456     iounmap(ahb_gating_reg0_v);
  28. 459                                 
  29. 460     /*SPI0 setting*/
  30. 461     spi0_base_addr_v = ioremap(SPI0_BASE_ADDR, 44); //spi reg count = 11

  31. 466     //spi0_CCTL
  32. 469     regVal = 0x0000101D; //sclk=5M 0x1D = 29 ,2 *(29+1) = 60
  33. 470     writel(regVal, spi0_base_addr_v+SPI_CLK_RATE_REG);

  34. 476     for(i=0;i<11;i++)  //打印出来看看寄存器的设置
  35. 477     {
  36. 478         regVal = readl(spi0_base_addr_v+i*4);
  37. 479         spi_err("SPI0_BASE_ADDR_V+%d = %08X", i, regVal);
  38. 480     }
  39. 481
  40. 484     regVal = 0x00130013; //manual set ss 1 , 0 , mode=0
  41. 485     writel(regVal, spi0_base_addr_v+SPI_CTL_REG);   
  42. 490 }
复制代码
-------------------------------------------------------------------
spi_write 函数
  1. static inline ssize_t writeByte(const char *buffer)
  2. 140 {
  3. 141     u32  regVal;
  4. 143     cs_activate();  //片选拉低
  5. 153     writel(*buffer, spi0_base_addr_v+SPI_TXDATA_REG);
  6. 154     cs_inactivate(); //片选拉高
  7. 156     return 1;
  8. 157 }
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-1-25 09:26:50 | 显示全部楼层
没有大侠, 写SPI寄存器么?
回复 支持 反对

使用道具 举报

发表于 2014-1-25 15:14:01 | 显示全部楼层
确定你的寄存器是否真的写进去了,另外,查看一下SPI设备是否启动了,时钟是否正常工作。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-11-24 02:00 , Processed in 0.021590 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部