我在STM32外面接了一个ADC-TLC2543,用STM32的SPI传输ADC转换之后的结果。现在我用示波器观察STM32中MOSI(PA7)的输出,示波器中没有波形(片选信号和时钟信号正常),把MOSI接到ADC中,ADC的输出用示波器看有波形,但输入STM32中读出的数据很小,不正确,不知道是哪里出错了??
大神们能不能帮我看看???
int main(void)
{
u16 Channel_Select_Tx=0; //用模拟通道0,1,2
u16 SPI_Rx=0; //存储SPI接受到的数据
RCC_Configuration();
GPIO_Configuration();
SPI_Configuration();
// useless=Read_TLC2543(Channel_Select_Tx[0]); //SPI传输的是上一个AD转换的结果,第一个数据没用
while(1)
{
SPI_Rx=Read_TLC2543(Channel_Select_Tx);
SPI_Rx=SPI_Rx+1;
}
}
void SPI_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; //双线全双工模式
SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //主
SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b; //16位
SPI_InitStructure.SPI_CPOL=SPI_CPOL_High; //时钟脚闲置时保持低电平
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge; //在第一个时钟沿采样数据信号
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft; //软件NSS,片选信号由软件产生
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256; //对时钟256分频
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //高位在前
// SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_Init(SPI1,&SPI_InitStructure);
SPI_Cmd(SPI1,ENABLE);
}
u16 Read_TLC2543(u16 chan)
{
u16 ADCdata;
chan<<=12;
chan|=0x0C00;
GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET); //片选信号拉低
Delay_nms(100); //加入延时,速度过快读不到数据
//等待SPI1 TX buffer 为空
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
//发送SPI1的数据
SPI_I2S_SendData(SPI1,chan);
//等待SPI1完成数据接收
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);
//读SPI1所接受到的数据
ADCdata=SPI_I2S_ReceiveData(SPI1);
Delay_nms(100);
// ADCdata>>=4; //读取的数据为16位,第四为为0
GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_SET); //一次转化完成,片选拉高
return ADCdata;
}
以上是我的部分程序。谢谢啦!!!!
此帖出自
小平头技术问答
一周热门 更多>