yyzhen 发表于 2011-8-17 17:31:03

发个msp430的IO口模拟SPI

unsigned char SPI_Read(void)
{
        unsigned char i,temp=0;
      RF4432_SCLK_0;
      delay_nus(1);
for(i=0;i<8;i++)
{
   temp<<=1;
   RF4432_SCLK_1;
   delay_nus(1);
   if (RF4432_SDO)        //读取最高位,保存至最末尾,通过左移位完成整个字节
   temp |= 0x01;
   RF4432_SCLK_0;
   delay_nus(1);
}
   RF4432_SCLK_0;
delay_nus(1);
return temp;
}
void SPI_Write(unsigned char txdata)
{
        unsigned char i;
       RF4432_SCLK_0;
       delay_nus(1);
      for(i=0;i<8;i++)
      {
        RF4432_SCLK_0;
      if(0x80&txdata)
      RF4432_SDI_1;
      else RF4432_SDI_0;
       delay_nus(1);
       RF4432_SCLK_1;
        delay_nus(1);
       txdata<<=1;
      }
    RF4432_SCLK_0;
    delay_nus(1);

}
//********************************************************************************//
//* 函数名:                                                 RF4432_WriteReg( )                                          //
//* 函数功能:                   RF4432寄存器写入函数                           //
//********************************************************************************//
voidSpiWriteRegister(unsigned charaddr, unsigned char value)
{
        RF4432_SEL_0;
      delay_nus(1);               
        SPI_Write(addr|0x80); //地址最高位置1   
        SPI_Write(value);         
        RF4432_SEL_1;
      delay_nus(1);               
}
//********************************************************************************//
//* 函数名:                                       RF4432_ReadReg(unsigned charaddr)                                //
//* 函数功能:               RF4432寄存器读取函数                                 //
//********************************************************************************//
unsigned charSpiReadRegister(unsigned charaddr)
{
        unsigned char value;
        RF4432_SEL_0;
         delay_nus(1);                  
        SPI_Write(addr|0x7f);//地址最高位置0      
        value = SPI_Read();         
        RF4432_SEL_1;
      delay_nus(1);         
        return value;
}

spi.h文件中需定义:
#define IO_SPI_DIR    P2DIR |=BIT0+BIT1+BIT3+BIT4//p2的0,1,3,4管脚为输出,其余为输入
#define RF_SDN_1      P2OUT |=BIT0   //p2_0口为输出模式,做为RF_SDN的控制
#define RF_SDN_0      P2OUT &=~BIT0
#define RF4432_SDI_1P2OUT |=BIT1   //p2_1口为SPI数据输入
#define RF4432_SDI_0P2OUT &=~BIT1
#define RF4432_SEL_1P2OUT |=BIT4//p2_4口为SPI片选
#define RF4432_SEL_0P2OUT &=~BIT4
#define RF4432_SCLK_1 P2OUT |=BIT3//p2_3口为SPI时钟输出
#define RF4432_SCLK_0 P2OUT &=~BIT3
#define RF4432_SDO    (P2IN &BIT2) //p2_2口为SPI数据输出
#define RF4432_IRQ    (P2IN &BIT5)//p2_5口为SI4432工作状态指示端口

mbb_qdzj 发表于 2011-9-9 21:46:44

f149自带 还不怎么会用...... 只会模拟 汗

yl20084784 发表于 2011-9-13 16:56:16

有没有用430的USART的SPI模式驱动SD卡的程序?

yl20084784 发表于 2011-9-13 17:30:35

求教楼主个问题,在用430内置USART模块的SPI模式初始化SD卡的时候,SD卡的时序要求初始化要48个byte,而430单片机的发送缓存一次只能发8个byte,这个怎么整?

yl20084784 发表于 2011-9-15 14:59:11

楼主还没现身呢..../emotion/em024.gif
页: [1]
查看完整版本: 发个msp430的IO口模拟SPI