打印

DSP281X硬件SPI读写一体化C++函数(驱动74hc595)

[复制链接]
4276|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2008-4-17 02:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//菜农HotPower@126.com 2008.4.17 1:58
void SystemObj::InitSpi(void)
{

    EALLOW;
    GpioMuxRegs.GPFMUX.all |= 0x000F;    // Select GPIOs to be SPI pins     
                                     // Port F MUX - x000 0000 0000 1111
      EDIS;

// Initialize SPI FIFO registers
    SpiaRegs.SPIFFTX.all=0xE040;
    SpiaRegs.SPIFFRX.all=0x204f;
    SpiaRegs.SPIFFCT.all=0x0;

      SpiaRegs.SPICCR.all =0x0008;                 // Reset on, rising edge, 8-bit char bits  
      SpiaRegs.SPICTL.all =0x0006;                 // Enable master mode, normal phase,
                                                 // enable talk, and SPI int disabled.
      SpiaRegs.SPIBRR =0x007F;                                    
    SpiaRegs.SPICCR.all =0x009F;                 // Relinquish SPI from Reset   
    SpiaRegs.SPIPRI.bit.FREE = 1;                // Set so breakpoints don't disturb xmission
    
    //(CLKPOLARITY,CLK_PHASE )01 10支持74HC595,00或11不支持  测试通过 
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
    
      System.SpiReadWrite(0xff);//LED数码管灭
    //发送595锁存脉冲信号RCLK
      SpiRclkRegs = 0;
      SpiRclkRegs = 1;
}

//硬件SPI读写一体化函数
unsigned char SystemObj::SpiReadWrite(unsigned char cData)
{
      SpiaRegs.SPITXBUF = cData;
    // Wait until data is received
      while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) 
      { 
//        KickDog();//喂狗测试
      }             
    // Check against sent data
      return SpiaRegs.SPIRXBUF;                
}



//数码管
#define LedSegA  0x01
#define LedSegB  0x02
#define LedSegC  0x04
#define LedSegD  0x08
#define LedSegE  0x10
#define LedSegF  0x20
#define LedSegG  0x40
#define LedSegH  0x80
/*
#define LedSegA  0x80
#define LedSegB  0x40
#define LedSegC  0x20
#define LedSegD  0x10
#define LedSegE  0x08
#define LedSegF  0x04
#define LedSegG  0x02
#define LedSegH  0x01
*/

#define LedChar0 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegE + LedSegF          )
#define LedChar1 (          LedSegB + LedSegC                                        )
#define LedChar2 (LedSegA + LedSegB           + LedSegD + LedSegE           + LedSegG)
#define LedChar3 (LedSegA + LedSegB + LedSegC + LedSegD                     + LedSegG)
#define LedChar4 (          LedSegB + LedSegC                     + LedSegF + LedSegG)
#define LedChar5 (LedSegA           + LedSegC + LedSegD           + LedSegF + LedSegG)
#define LedChar6 (LedSegA           + LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedChar7 (LedSegA + LedSegB + LedSegC                                        )
#define LedChar8 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedChar9 (LedSegA + LedSegB + LedSegC + LedSegD           + LedSegF + LedSegG)
#define LedCharA (LedSegA + LedSegB + LedSegC           + LedSegE + LedSegF + LedSegG)
#define LedCharB (                    LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedCharC (LedSegA                     + LedSegD + LedSegE + LedSegF          )
#define LedCharD (          LedSegB + LedSegC + LedSegD + LedSegE           + LedSegG)
#define LedCharE (LedSegA                     + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedCharF (LedSegA                               + LedSegE + LedSegF + LedSegG)



interrupt void ISRTimer2(void)
{
//以下定义为共阳数码管
static const unsigned char LedTab[] = 
{//显示字符表存放在ROM中
  LedChar0, LedChar1, LedChar2, LedChar3,
  LedChar4, LedChar5, LedChar6, LedChar7,
  LedChar8, LedChar9, LedCharA, LedCharB,
  LedCharC, LedCharD, LedCharE, LedCharF
};
    System.SpiReadWrite(~LedTab[Timer.Count2 & 0x0f]);//硬件SPI读写一体化函数
    Timer.Count2++;
//发送595锁存脉冲信号RCLK
    SpiRclkRegs = 0;
    SpiRclkRegs = 1;
}

//数码管
#define LedSegA  0x01
#define LedSegB  0x02
#define LedSegC  0x04
#define LedSegD  0x08
#define LedSegE  0x10
#define LedSegF  0x20
#define LedSegG  0x40
#define LedSegH  0x80
/*
#define LedSegA  0x80
#define LedSegB  0x40
#define LedSegC  0x20
#define LedSegD  0x10
#define LedSegE  0x08
#define LedSegF  0x04
#define LedSegG  0x02
#define LedSegH  0x01
*/

#define LedChar0 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegE + LedSegF          )
#define LedChar1 (          LedSegB + LedSegC                                        )
#define LedChar2 (LedSegA + LedSegB           + LedSegD + LedSegE           + LedSegG)
#define LedChar3 (LedSegA + LedSegB + LedSegC + LedSegD                     + LedSegG)
#define LedChar4 (          LedSegB + LedSegC                     + LedSegF + LedSegG)
#define LedChar5 (LedSegA           + LedSegC + LedSegD           + LedSegF + LedSegG)
#define LedChar6 (LedSegA           + LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedChar7 (LedSegA + LedSegB + LedSegC                                        )
#define LedChar8 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedChar9 (LedSegA + LedSegB + LedSegC + LedSegD           + LedSegF + LedSegG)
#define LedCharA (LedSegA + LedSegB + LedSegC           + LedSegE + LedSegF + LedSegG)
#define LedCharB (                    LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedCharC (LedSegA                     + LedSegD + LedSegE + LedSegF          )
#define LedCharD (          LedSegB + LedSegC + LedSegD + LedSegE           + LedSegG)
#define LedCharE (LedSegA                     + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedCharF (LedSegA                               + LedSegE + LedSegF + LedSegG)

相关帖子

沙发
zgl7903| | 2008-4-17 09:08 | 只看该作者

数码管格雷码的这一段定义比较赞赏 学习了

使用特权

评论回复
板凳
zealane| | 2008-5-11 22:29 | 只看该作者

hot大叔也搞个spi中断收发的啊,最好16位。

那样传输大量数据效率最高喽。

使用特权

评论回复
地板
hotpower|  楼主 | 2008-5-11 22:31 | 只看该作者

九天的板子SPI只接了74hc595,实在不能双向~~~准备做MCBSP

使用特权

评论回复
5
hotpower|  楼主 | 2008-5-11 22:33 | 只看该作者

回4楼,中断收发很简单,不过俺记得2812的DSP好象只有8位

使用特权

评论回复
6
zealane| | 2008-5-12 10:43 | 只看该作者

2812是16位增强的spi

我现在spi也是8位传输,要传输6千个字节的数据,片内sram实在不够,放在片外ram读速度又比较慢,所以需要将6000个字节改成3000个uint16,完全利用16位数据线。
用中断是程序的数据量运算量大,需要高效率传输。
大叔不妨将spi接出来,通到其他mcu测试嘛~~~~~~~
比如主机用arm,从机dsp。这样做到两个mcu的数据传输。。。。

使用特权

评论回复
7
zealane| | 2008-5-12 10:44 | 只看该作者

大叔把dsp当单片机玩,自然没有多少人响应瓦~~~

咳咳

使用特权

评论回复
8
yysmcu| | 2008-5-12 11:42 | 只看该作者

向HOT大叔学习

使用特权

评论回复
9
hotpower|  楼主 | 2008-5-12 21:26 | 只看该作者

哈哈~~~这些不过是例程~~~俺知道该如何玩

使用特权

评论回复
10
fiann| | 2008-5-23 17:15 | 只看该作者

请教

//硬件SPI读写一体化函数
unsigned char SystemObj::SpiReadWrite(unsigned char cData)
{
      SpiaRegs.SPITXBUF = cData;
    // Wait until data is received
      while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) 
      { 
//        KickDog();//喂狗测试
      }             
    // Check against sent data
      return SpiaRegs.SPIRXBUF;                
}


函数返回的是一个伪数据吧?

使用特权

评论回复
11
hotpower|  楼主 | 2008-5-25 21:39 | 只看该作者

都回的SPI数据(MISO)

使用特权

评论回复
12
zhongxon| | 2008-5-26 09:39 | 只看该作者

hotpower老兄的技术很厉害,人也很厚道。

你老兄做个2812的开发板吧,高水平 ,严要求,做个精品。
咱们还得在21上继续下去,别处也没更好的论坛,想信,咱们在这好好弄弄,应当还不错吧。。

使用特权

评论回复
13
phoenixmy| | 2008-5-26 09:59 | 只看该作者

哈哈



顶~~~~~~~~~~~~

使用特权

评论回复
14
涛行九天| | 2008-7-2 21:15 | 只看该作者

hq_y的建议甚好

如果大叔在北京,我早就上十二台大轿给抢过来了
哈哈

使用特权

评论回复
15
hotpower|  楼主 | 2008-7-4 01:19 | 只看该作者

九天同志很抱歉~~~最近精力在54x上,改日把281x整理一下~~~

使用特权

评论回复
16
hq_y| | 2008-7-4 09:01 | 只看该作者

九天没有诚意,西安离北京不远啊

使用特权

评论回复
17
涛行九天| | 2008-8-17 00:23 | 只看该作者

据我所知,大叔在家密炼上乘武功

使用特权

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

本版积分规则

1460

主题

21619

帖子

506

粉丝