STM32模拟SPI接口程序

2019-07-14 20:36发布

因为需要挂3个TLC2543,内部的2个SPI已用完,开始着手模拟SPI接口,但始终电压显示不正常,求各位大侠支招。




/***************宏定义********************/  

#define TLC2543_CS         4         
#define TLC2543_MISO     5  
#define TLC2543_MOSI     2  
#define TLC2543_CLK       3
       
         
#define TLC2543_CLK_3_PORT     GPIOE    //PE3
#define TLC2543_CLK_3_CLK       RCC_APB2Periph_GPIOE
#define TLC2543_CLK_3_PIN       GPIO_Pin_3
#define TLC2543_CLK_3_H( )       GPIO_SetBits  (TLC2543_CLK_3_PORT,TLC2543_CLK_3_PIN);
#define TLC2543_CLK_3_L( )       GPIO_ResetBits(TLC2543_CLK_3_PORT,TLC2543_CLK_3_PIN);

#define TLC2543_SO_3_PORT    GPIOE    //PE5
#define TLC2543_SO_3_CLK      RCC_APB2Periph_GPIOE
#define TLC2543_SO_3_PIN       GPIO_Pin_5  

#define TLC2543_SI_3_PORT      GPIOE    //PE2
#define TLC2543_SI_3_CLK         RCC_APB2Periph_GPIOE
#define TLC2543_SI_3_PIN            GPIO_Pin_2
#define TLC2543_MOSI_3_H( )    GPIO_SetBits  (TLC2543_SI_3_PORT,TLC2543_SI_3_PIN);
#define TLC2543_MOSI_3_L( )    GPIO_ResetBits(TLC2543_SI_3_PORT,TLC2543_SI_3_PIN);

#define TLC2543_CS_3_PORT    GPIOE    //PE4
#define TLC2543_CS_3_CLK       RCC_APB2Periph_GPIOE
#define TLC2543_CS_3_PIN       GPIO_Pin_4
#define TLC2543_CS_3_H( )       GPIO_SetBits  (TLC2543_CS_3_PORT,TLC2543_CS_3_PIN);
#define TLC2543_CS_3_L( )        GPIO_ResetBits(TLC2543_CS_3_PORT,TLC2543_CS_3_PIN);

/*********************************
模拟SPI初始化
********************************/
void TLC2543_Init(void)
{   
          GPIO_InitTypeDef GPIO_InitStructure;
          RCC_APB2PeriphClockCmd(TLC2543_CLK_3_CLK|TLC2543_SI_3_CLK|TLC2543_SO_3_CLK, ENABLE);
          TLC2543_CS_3_H( );  
          TLC2543_CLK_3_L( );   
       
          GPIO_InitStructure.GPIO_Pin = TLC2543_CS_3_PIN;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(TLC2543_CS_3_PORT, &GPIO_InitStructure);
       
          GPIO_InitStructure.GPIO_Pin = TLC2543_SO_3_PIN;
          GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;// 上位输入
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(TLC2543_SO_3_PORT, &GPIO_InitStructure);
       
          GPIO_InitStructure.GPIO_Pin = TLC2543_SI_3_PIN;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(TLC2543_SI_3_PORT, &GPIO_InitStructure);
       
          GPIO_InitStructure.GPIO_Pin = TLC2543_CLK_3_PIN;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(TLC2543_CLK_3_PORT, &GPIO_InitStructure);  
}          


void TLC2543_Send(u8 data)  
{  
    u8 i;  
    TLC2543_CS_3_L( );      
    TLC2543_CLK_3_L( );      
    TLC2543_MOSI_3_L( );  
    Delay_us(30);
    for(i=0;i<8;i++)  
     {   
         if(data&(0x80>>i))
                  {TLC2543_MOSI_3_H( );}
        else
                 {TLC2543_MOSI_3_L( );}   
            
        Delay_us(30);  
        TLC2543_CLK_3_H( );      
        Delay_us(30);   
        TLC2543_CLK_3_L( );  
      }  
    Delay_us(30);   
    TLC2543_CS_3_H();        
}  

u32 TLC2543_Get( )   
{  
    u8 i;  
    u32 data=0;  
    TLC2543_CS_3_L( );      
    TLC2543_CLK_3_L( );      
    TLC2543_MOSI_3_L( );  
    Delay_us(30);  
    for(i=0;i<12;i++)
     {         
       if(GPIO_ReadInputDataBit(TLC2543_SO_3_PORT,TLC2543_SO_3_PIN))
          data|=(0x800>>i);  
        Delay_us(30);  
        TLC2543_CLK_3_H( );      
        Delay_us(30);
        TLC2543_CLK_3_L( );  
     }  
    Delay_us(30);
    TLC2543_CS_3_H( );        
    return data;  
}   


u32 Read_TLC2543(u8 chan)  
{  
    u32 adc_data;  
    chan <<= 4;  
    chan |= 0x04;
          TLC2543_Send(chan);  
    adc_data = TLC2543_Get( );  
          //adc_data = (u32)adc_data * BASE_V / ( 0x0FFF  );
    return adc_data;  
}         


0条回答

一周热门 更多>