打印
[技术问答]

MUCXX SPI 调试有时钟,但是看不到数据,求教

[复制链接]
1831|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
niuyaliang|  楼主 | 2014-2-14 12:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 niuyaliang 于 2014-2-17 12:42 编辑

我选择SPI的主机模式,然后把四根线都悬空,主函数不停的发送一个值,我用逻辑分析仪抓引脚的波形,应该能看到输出的数据了,可是我把官网给的程序烧进去,只看得到时钟的和SS引脚的波形,看不到数据的波形,这是怎么一回事

五楼更新代码
沙发
a_ziliu| | 2014-2-14 16:07 | 只看该作者
可以貼上代碼嗎?只有文字描述,這樣很難理解問題在那。

使用特权

评论回复
板凳
niuyaliang|  楼主 | 2014-2-14 18:15 | 只看该作者
a_ziliu 发表于 2014-2-14 16:07
可以貼上代碼嗎?只有文字描述,這樣很難理解問題在那。
        /* Step 1. Enable and Select SPI clock source*/
        SYSCLK->APBCLK.SPI0_EN  =1;
        SYS->IPRSTC2.SPI0_RST   =1;
        SYS->IPRSTC2.SPI0_RST   =0;

        /* Step 2. GPIO initial */
        SYS->GPCMFP.SPI0_SS0_I2SLRCLK         =1;
        SYS->GPCMFP.SPI0_CLK_I2SBCLK         =1;
        SYS->GPCMFP.SPI0_MISO0_I2SDI         =1;
        SYS->GPCMFP.SPI0_MOSI0_I2SDO         =1;

        /* Step 3. Set SCLK */
        SPI0->DIVIDER.DIVIDER        =4;        // HCLK/(DIVIDER+1) = 22.1184Mhz/(4+1) = 4.42568Mhz

        /* Step 4. Select Operation mode */
        SPI0->CNTRL.SLAVE = 0;                //Master mode

        SPI0->CNTRL.LSB = 0;                //MSB
//        SPI0->CNTRL.TX_BIT_LEN = 8; //Length:8 bit

        SPI0->CNTRL.CLKP = 1;                //SCLK idle high
        SPI0->CNTRL.TX_NEG = 1;                //Change SDO on falling edge of SCLK
        SPI0->CNTRL.RX_NEG = 0;                //Latch SDI on rising edge of SCLK

        SPI0->SSR.AUTOSS = 0;                         //Disable automatic slave select
        SPI0->SSR.SS_LVL = 0;                //SS low active
//        SPI0->SSR.SSR = 1;                        //SPI0_SS0


SPI的初始化部分

使用特权

评论回复
地板
niuyaliang|  楼主 | 2014-2-14 18:16 | 只看该作者
a_ziliu 发表于 2014-2-14 16:07
可以貼上代碼嗎?只有文字描述,這樣很難理解問題在那。
                SPI0->SSR.SSR = 1;                                                                                        //SPI0_SS0 active
                SPI0->CNTRL.TX_BIT_LEN = 8;                        //Set length of TX and RX       
                SPI0->TX[0] = 0xF0; //Store data into TX buffer                              
                SPI0->CNTRL.GO_BUSY=1;                                                                                 //Start TX and RX
                while(SPI0->CNTRL.GO_BUSY);                                                                        //Check busy
                SPI0->SSR.SSR = 0;                                                                                        //SPI0_SS0 inactive
                DrvSYS_Delay(10000);

发送SPI的部分

使用特权

评论回复
5
niuyaliang|  楼主 | 2014-2-17 12:41 | 只看该作者
#include "SPI_CS5532.h"

void SPI_Init(void)
{
        //配置SPI0的四根线为特殊功能模式,还有一个位决定,但那个复位后默认为0,不配置
SYS->GPCMFP.SPI0_SS0_I2SLRCLK = 1;
SYS->GPCMFP.SPI0_CLK_I2SBCLK  = 1;
SYS->GPCMFP.SPI0_MISO0_I2SDI = 1;
SYS->GPCMFP.SPI0_MOSI0_I2SDO  = 1;
        //使能SPI0的时钟
SYSCLK->APBCLK.SPI0_EN = 1;
        //设置SPI0的时钟频率,有公式可以计算,这里设置为1MHZ,时钟频率的构成由VARCLK_EN位决定
SPI0->DIVIDER.DIVIDER = 5;
        //由于复位后默认为主机模式,不予以配置,这里配置
SPI0->CNTRL.SLAVE = 0;
  //从机选择的配置
        //禁用自动从机选择   从机选择是下降沿触发(默认边沿触发)   激活SS0的状态
SPI0->SSR.AUTOSS = 0;
SPI0->SSR.SS_LVL = 0;
SPI0->SSR.SSR = 1;

//时钟空闲为高电平       
SPI0->CNTRL.CLKP = 1;
//在下降沿改变发送数据信号
SPI0->CNTRL.TX_NEG = 0;       
//在下降沿改变锁存数据信号
SPI0->CNTRL.RX_NEG = 1;       
//设定一次字传输为8位
SPI0->CNTRL.TX_BIT_LEN = 0x08;
//设定LSB优先发送
SPI0->CNTRL.LSB = 1;
       
}
SPI的初始化部分

使用特权

评论回复
6
niuyaliang|  楼主 | 2014-2-17 12:42 | 只看该作者
                while(SPI0->CNTRL.GO_BUSY == 0)//当SPI数据传输完毕时
                {
                        printf("GO_BUSY is %x \n",SPI0->CNTRL.GO_BUSY);
                        printf("TX_EMPTY is %x \n",(SPI0->CNTRL.RESERVE1)&0x04);
                        SPI0->TX[0] = 0x01;//把数据写入tx缓冲中
                        printf("TX_EMPTY is %x \n",(SPI0->CNTRL.RESERVE1)&0x04);
                        SPI0->CNTRL.GO_BUSY = 1;//此位写一开始数据传输
                        printf("GO_BUSY is %x \n",SPI0->CNTRL.GO_BUSY);
                       

                }
主函数中循环发送数据

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝