您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF518的SPI问题
本帖共有530个阅读者
发表帖子 发表投票 回复主题
BF518的SPI问题
hb923(论坛新手)
hb923
头衔:社区公民
帮派:无帮无派
帖数:9
金钱:170
积分:12
注册时间:2013/4/1
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF518的SPI问题

我和一个按键/LED控制IC=BC7277进行SPI0控制.结果发现

1:由于BC7277工作在64KHZ以下.我对SPI0_BAND=0X0320

2:我检测SPI0_SCK,发现上电复位波形是12.5M的脉冲,但是我初始化SPI后,波形基本没变化,并没有达到我想的64K以下.

3:我测试SPI0_MISO和SPI0_MOSI,都没测到信号,全是不稳定的高电平.

4:F10运行,发现控制有效,能发送数据,但是是错误的.能接受数据,但是也是错误的.--由于示波器无法检测,不知道问题在哪儿.

5:代码如下

Set_PLL(16,4);

Init_Bc7277_Ports();

SPI0_init();

while(1)
          {
            keydata=Bc7277_SPI0_rw(0x1d,0xff);}

void Init_Bc7277_Ports(void)
{
*pPORTG_FER                   |=PG12|PG13|PG14|PG15;        //PG12-PG15=peripheral function
*pPORTG_MUX                   &=0x3fff;
}

void SPI0_init(void)
{
*pSPI0_BAUD=0x0320;                     //配置速率为1/4系统时钟  SPI速率 = SCLK/2*SPI_BAUD
*pSPI0_FLG |=FLS2;    //选择SPI0SEL2接口
*pSPI0_CTL = 0x1001|CPHA| CPOL|EMISO|GM;  //配置模式为手动片选模式
*pSPI0_CTL = (*pSPI0_CTL | SPE); //使能SPI1接口
}

unsigned int Bc7277_SPI0_rw(unsigned char address,unsigned char data)                        //从SPI中读取数据        
{          
          unsigned int read_bc7277_buf;
unsigned int  i,j;
*pSPI_FLG &=~FLG2;                      //将SPI0SEL2拉到0-----------?在ADS7843.C中不用          
delay(0x0320);
          while(!(*pSPI_STAT&SPIF));              //查看SPI传输状态是否完成          
          *pSPI0_TDBR         =address;                 //将数据传入SPI传输数据寄存器0X55          
          *pSPI0_FLG          |=FLG2;             //-----------?在ADS7843.C中不用
          while(*pSPI_STAT & RXS)                 //查看SPI传输状态是否有数据需要接受
          j                   =*pSPI_RDBR;        //读取数据          
          *pSPI_FLG           |=FLG2;             //将SPI0SEL2拉到1,完成数据传输.-----------?在ADS7843.C中不用
          
          *pSPI_FLG &=~FLG2;                      //将SPI0SEL2拉到0-----------?在ADS7843.C中不用          
          while(!(*pSPI_STAT&SPIF));              //查看SPI传输状态是否完成          
          *pSPI0_TDBR         =data;                 //将数据传入SPI传输数据寄存器0X55          
         *pSPI0_FLG          |=FLG2;             //-----------?在ADS7843.C中不用
          
          *pSPI0_FLG          &=FLG2;             //将SPI0SEL2拉到0-----------?在ADS7843.C中不用
          while(*pSPI_STAT & RXS)                 //查看SPI传输状态是否有数据需要接受
          j                   =*pSPI_RDBR;        //读取数据          
          *pSPI_FLG           |=FLG2;             //将SPI0SEL2拉到1,完成数据传输.-----------?在ADS7843.C中不用
          read_bc7277_buf     =j;                 //格式转换=>read_bc7277_buf=(unsigned char) j;
          return(read_bc7277_buf);
}  



做有音效的鼓击器。
等级:论坛新手 参考IP地址:*.*.*.*
2013/4/2 10:33:32
hb923(论坛新手)
hb923
头衔:社区公民
帮派:无帮无派
帖数:9
金钱:170
积分:12
注册时间:2013/4/1
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
我们在用BF518的仿真器。530ICE+BF51X V1.0的开发板。

        我按你说的用SPI1作为接口,用PF0作为片选,PH0,PH1,PH2,PH3作为信号

        问题如下:在不接外部设备的情况下,我测试扩展PORT3,PORT4来检测。

        示波器能看到PF0的SPI1_SSEL2的变化,但是SPI1_SCK,SPI1_MOSI检测不到。

        代码如下:

        Set_PLL(16,4);

        Init_Bc7277_Ports();

        SPI1_init();        

while(1)          {keydata=Bc7277_SPI0_rw(0x1d,0xff);}

//==========================================

void Init_Bc7277_Ports(void)

{

*pPORTF_FER                   |=PF0;

*pPORTF_MUX                   =0x0002;      

*pPORTH_FER                   |=PH0|PH1|PH2|PH3;//PG12|PG13|PG14|PG15;        

*pPORTH_MUX                   =0x0001;

}

//**************************************************

void SPI0_init(void)

{

*pSPI1_BAUD=0x0320;                     //BC7277需要工作在64KHZ以下。

*pSPI1_FLG |=FLS2;  

*pSPI1_CTL = 0x1001|CPHA| CPOL|EMISO|GM;  

*pSPI1_CTL = (*pSPI1_CTL | SPE);

}

//----------------------------------------------------------------------------------

unsigned int Bc7277_SPI0_rw(unsigned char address,unsigned char data)                        

{          

          unsigned int read_bc7277_buf;

          unsigned int  i,j;

         *pSPI1_FLG &=~FLG2;                      

          delay(0x0320);

          while(!(*pSPI1_STAT&SPIF));                        

          *pSPI1_TDBR         =address;                           //发送地址

          *pSPI1_FLG          |=FLG2;            

          while(*pSPI1_STAT & RXS)                

          j                   =*pSPI1_RDBR;                           //返回按键高位

          *pSPI1_FLG           |=FLG2;                      

          *pSPI1_FLG &=~FLG2;                      

          while(!(*pSPI1_STAT&SPIF));                        

          *pSPI1_TDBR         =data;                               //发送数据

          *pSPI1_FLG          |=FLG2;            

           *pSPI1_FLG          &=FLG2;            

          while(*pSPI1_STAT & RXS)                

          j                   =*pSPI1_RDBR;                         //返回按键低位

          *pSPI1_FLG           |=FLG2;            

          read_bc7277_buf     =j;                

          return(read_bc7277_buf);                               //只需要按键低位的数据

}  


做有音效的鼓击器。
等级:论坛新手 参考IP地址:*.*.*.*
2013/4/2 14:46:10
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你看一下开发板后面的SW5和SW6是否全都拨到了OFF,避免网卡影响。
你测试时,代码需连续运行,单步运行不能测到SPI的时钟和数据。
你可以写一个只连续发送数据的代码,测试SPI时钟和MOSI。
另外,代码中在判断接收数据时,并未将片选拉低。而这种操作也是不正确。

    *pSPI1_FLG &=~FLG2;                      

          delay(0x0320);

          while(!(*pSPI1_STAT&SPIF));                        

          *pSPI1_TDBR         =address;                           //发送地址

          *pSPI1_FLG          |=FLG2;            

          while(*pSPI1_STAT & RXS)                

          j                   =*pSPI1_RDBR;                           //返回按键高位

          *pSPI1_FLG           |=FLG2;                      


SPI的时钟只能在发送数据时产生,所以如果想接收数据,必须先发送数据,以获得接收数据的时钟。通常在发送完数据后,直接判断是否有接收数据存在,再从寄存器读取数据。仅仅对接收数据寄存器做操作,不会获取SPI端口上的数据。




这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/4/2 15:58:26
hb923(论坛新手)
hb923
头衔:社区公民
帮派:无帮无派
帖数:9
金钱:170
积分:12
注册时间:2013/4/1
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
测试发现:
Init_EBIU(); 在设置时钟后加入这段,有MOSI,MISO信号出现。
void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}
这段不是给CPLD配置的么?我直接使用IO口,没有用CPLD啊。?

做有音效的鼓击器。
等级:论坛新手 参考IP地址:*.*.*.*
2013/4/2 16:05:16
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
这段是EBIU接口的初始化,配置CPLD会用到EBIU接口。
理论上EBIU接口和SPI没有关系,你使用的接口无需配置EBIU。具体为何配置后才可以使用,我也不太清楚。不知道是不是芯片BUG。
如果配置EBIU后SPI可用,就在代码中配置一下吧。



这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/4/2 19:13:23
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159203 Call, 1 Queries, Processed in 0.015625 second(s),