STM32模拟SPI接口程序
时间:10-02
整理:3721RD
点击:
因为需要挂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;
}
/***************宏定义********************/
#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;
}
自顶
1