搜索
bottom↓
回复: 5

Linux下S3C2416的SPI设置问题,CLK和MOSI都没有输出,求助

[复制链接]

出0入0汤圆

发表于 2012-6-14 22:30:40 | 显示全部楼层 |阅读模式
最近在Linux下搞S3C2416的SPI驱动,我将SPI的CLK设置好后,也配置了输出,并且将TX打开,就是没有时钟输出,我也查了PCLKCON里面SPI的时钟源已经使能了,
所以求助有没有大神搞过2416的SPI,指点一二。
我使用的流程:
1、配置MOSI MISO CLK CS为SPI模式 并禁止上下拉
2、配置CH_CFG,设置空闲CLK、传输格式FORMATA、开启TX RX,设置为MASTER模式
3、配置CLK_CFG,选择PCLK为时钟源没分频输入,配置输出CLK为4Mhz,开启CLK使能
4、配置SLAVE_CFG_REG,配置为手动并使能SS
5、关闭所有SPI中断,使用查询模式
6、等待STATUS里面 TX_Done位置1表示发送完成
7、想TX寄存器写数据                (就在这步,CLK和MOSI死活没有动静)
8、继续重复第6步

以上流程是否有错,请前辈指点下.

出0入0汤圆

 楼主| 发表于 2012-6-17 17:07:06 | 显示全部楼层
以解决,删贴,每次提问都无人应答,故想,走自己的路

出0入0汤圆

发表于 2013-8-9 17:38:27 | 显示全部楼层
大哥,在吗?我也遇到了2416不出时钟的问题了?能帮我看下程序不?
//prepare Enable
        *sys_MISCCR |= (1<31); /*HS-SPI Select  HSSPI_EN2  Must be set ‘1’*/
//Pin mux
        *port_GPECON&=~(0x3f<<22);
        *port_GPECON|=(1<<27)|(1<<25)|(1<<23);        /*GPE13->SPICLK,GPE12->SPIMOSI,GPE11->SPIMISO; all clr*/

        *port_GPLCON&=~(0x3<<26);
        *port_GPLCON|=(1<<27);/*GPL13->SPISS,all clr*/
/*Pull/down-up disable*/
        *port_GPEUDP&=~(0x3F<<22);       
        *port_GPLUDP&=~(0x3<<26);       

//Clock on
        *clk_SCLKCON|=(1<<14); /* For HS-SPI        Enable HS-SPI_0 (EPLL) clock */
        *clk_PCLKCON|=(1<<6); /* For HS-SPI Enable PCLK into the SPI_HS0 */
#if 1
//SPI Regs
/*1.  Set Transfer Type. ( CPOL & CPHA set ) CPOL = 0, CPHA = 0 (Format A)*/
        *spi_CH_CFG |= (1<<5);        /*sw_rst enable*/
        *spi_CH_CFG &= ~(1<<5);        /*sw_rst disable*/
        *spi_CH_CFG|=3<<2;

/*2.  Set Clock configuration register. */
        *spi_CLK_CFG=0x5;        /*prescale=5*/
        *spi_CLK_CFG|=(1<<8);        /*Enable clock*/
       
/*3.  Set HS_SPI MODE configuration register.*/
        *spi_MODE_CFG|=(0x3FF<<19);        /*Trailing count refresh*/
        *spi_MODE_CFG|=(1<<5)|(1<<11);        /*Triger level*/

/*4.  Set HS_SPI INT_EN register. */
        *spi_HS_SPI_INT_EN|=0x3F;
       
/*5.  Set Packet Count configuration register if necessary. */
        //*spi_SPI_PACKAGE_COUNTER_REG=0x105;

/*6.  Set  Tx or Rx Channel on. */
        *spi_CH_CFG |= 1<<0;                /*Tx channal on*/
        *spi_CH_CFG |= 1<<1;        /*Rx channal on*/

/*7.  Set nSSout low to start Tx or Rx operation
        A.        Set nSSout Bit to low, then start TX data writing.
        B.        If auto chip selection bit is set, should not control nCS*/
        *spi_SLAVE_SLECTION_REG|=(0xFF<<4);/*nCS_time_count*/
        *spi_SLAVE_SLECTION_REG&=~(1<<0);        /*Manual mode,Enable SPI_CS*/

/*8. test send Byte*/
        *spi_SPI_TX_DATA = 0x55;

出0入0汤圆

 楼主| 发表于 2013-8-12 08:35:16 | 显示全部楼层
happyandsafe 发表于 2013-8-9 17:38
大哥,在吗?我也遇到了2416不出时钟的问题了?能帮我看下程序不?
//prepare Enable
        *sys_MISCCR |=  ...

int drv_spi_open(unsigned char mode,
                                                         unsigned char clktype,
                                                         unsigned char transtype,
                                                         unsigned int speed)
{
        unsigned int pclk;
        unsigned int val;
        unsigned char tmp;
        struct clk *clk;
        DBG("mode:%d",mode);
        DBG("clktype:%d",clktype);
        DBG("transtype:%d",transtype);
        DBG("speed:%d",speed);

   /* 获取PCLK */
        clk=clk_get(NULL,"pclk");
        pclk=clk_get_rate(clk);
        /* 根据速度计算分频值 */
        pclk=(pclk/speed/2)-1;
        DBG("DIV:%d",pclk);
       
       
       
   /*=========== 1、配置SPI引脚SPI模式 CLK MISO MOSI CS========*/
   HSSPI.io_reg->GPIOCON&=~(3<<26);   
        HSSPI.io_reg->GPIOCON|=2<<26;               /* GPE13设为SPICLK */
        HSSPI.io_reg->GPIOUDP&=~(3<<26);          /* 禁止上拉 */

        HSSPI.io_reg->GPIOCON&=~(3<<24);
        HSSPI.io_reg->GPIOCON|=2<<24;               /* GPE12设为SPIMOSI */
        HSSPI.io_reg->GPIOUDP&=~(3<<24);          /* 禁止上拉 */

        HSSPI.io_reg->GPIOCON&=~(3<<22);
        HSSPI.io_reg->GPIOCON|=2<<22;               /* GPE11设为SPIMISO */
        //HSSPI.io_reg->GPIOUDP&=~(3<<22);           /* 禁止上拉 */

        HSSPI.io_reg->GPIODAT&=~(7<<11);           /* 清空数据寄存器 */

        /* 配置SPI的CS */
        HSSPI.cs_reg->GPIOCON&=~(3<<26);
        HSSPI.cs_reg->GPIOCON|=2<<26;               /* GPL13设为SS */
        HSSPI.cs_reg->GPIOUDP&=~(3<<26);          /* 禁止上拉 */


        /*=========== 2、配置SPI寄存寄存器 ========*/
        HSSPI.spi_reg->CH_CFG=0;
        HSSPI.spi_reg->CH_CFG|=1<<5;                /* SPI复位 */
        udelay(5);
        HSSPI.spi_reg->CH_CFG&=~(1<<5);           /* 停止SPI复位 */
        HSSPI.spi_reg->CH_CFG|=mode<<4;          /* 设置主从模式 */
        HSSPI.spi_reg->CH_CFG|=clktype<<3;        /* 设置时钟模式 */
        HSSPI.spi_reg->CH_CFG|=transtype<<2;    /* 传输数据格式 */
        HSSPI.spi_reg->CH_CFG|=0<<1;                 /* 关闭RX */
        HSSPI.spi_reg->CH_CFG|=0<<0;                 /* 关闭TX */

       
        /*=========== 3、配置SPI时钟 ========*/
        HSSPI.spi_reg->CLK_CFG=0;
        HSSPI.spi_reg->CLK_CFG|=0<<8;       /* 开启时钟 */
        HSSPI.spi_reg->CLK_CFG|=0<<9;       /* 选择PCLK做时钟源 */
        HSSPI.spi_reg->CLK_CFG|=pclk<<0;   /* 配置时钟 */

        /*=========== 4、配置SPI传输数据宽度与中断触发等级 ========*/
        HSSPI.spi_reg->MODE_CFG=0;
        HSSPI.spi_reg->MODE_CFG|=0<<29;  /* 传输单位为字节 */
        HSSPI.spi_reg->MODE_CFG|=0<<17;  /* 总线宽度为字节 */
        HSSPI.spi_reg->MODE_CFG|=1<<11;  /* 接收中断触发字节为1字节 */
        HSSPI.spi_reg->MODE_CFG|=1<<5;    /* 发送中断触发字节为1字节 */
       
   /*=========== 5、配置SPI中断使能 ========*/
        HSSPI.spi_reg->HS_SPI_INT_EN=1<<1;

   /*=========== 6、配置交换字节 ========*/
        //HSSPI.spi_reg->SWAP_CFG=(1<<5)|(1<<1);

   /*=========== 7、配置SPI使能模式 ========*/
        HSSPI.spi_reg->SLAVE_SEL_REG=0x01;        /* 设置为手动设置并关闭SS */

  /*=========== 8、申请接收缓存 ========*/
         HSSPI.rxfifo.pbuf=kmalloc(256,GFP_KERNEL);  /* 申请接收内存 */
         if(HSSPI.rxfifo.pbuf==NULL)
         {
                 return HSSPI_ERR;
         }
         HSSPI.rxfifo.size        = 256;
         HSSPI.rxfifo.write = 0;
         HSSPI.rxfifo.read        = 0;
         
        /*=========== 9、安装SPI接收中断 ========*/
         HSSPI.irq_rx=S3C2416_IRQ_HSSPI;
         HSSPI.handler=drv_spi_irq;
         HSSPI.irq_rx_st=request_irq(HSSPI.irq_rx,HSSPI.handler,IRQF_SHARED|IRQF_DISABLED,"dev_spi",(void*)1);
         if(HSSPI.irq_rx_st!=0)
         {
                 DBG("request SPI IRQ RX fail!");
                 return HSSPI_ERR;
         }

   /*=========== 10、开启接收/发送端口 =========*/
   drv_spi_TxRxON();
        /*=========== 11、使能SPI =========*/
        drv_spi_enable();
       
        return 0 ;
       
       
}
void drv_spi_TxRxOFF(void)
{
        HSSPI.spi_reg->CH_CFG&=~0x03;
}

出0入0汤圆

 楼主| 发表于 2013-8-12 08:36:07 | 显示全部楼层
fengyuganyu 发表于 2013-8-12 08:35
int drv_spi_open(unsigned char mode,
                                                         unsigned char clktype,
                                                         unsigned char transtyp ...

int drv_spi_write(unsigned char *psend,unsigned int sendlen)
{

       
        if(sendlen!=0)
        {
                if(psend==NULL)
                {
                        return HSSPI_ERR;
                }

                while(sendlen)
                {
                        HSSPI.spi_reg->HS_SPI_TX_DATA=*psend;
               
                        psend++;
                        sendlen--;
                       
                        if(drv_spi_WaitTx(10)<0)          /* 等待发送数据完成 */
                        {

                                return HSSPI_ERR;
                        }

                }
        }
       

        return 0;
}

出0入0汤圆

发表于 2013-8-12 08:48:25 | 显示全部楼层
能不能把包含的头文件和自定义的结构体发给我啊?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 14:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表