STM32中SPI数据传输问题

2019-03-23 18:47发布

我在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;

}

以上是我的部分程序。谢谢啦!!!! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
damiaa
1楼-- · 2019-03-24 00:08
/ 要看看MOSI和MISO都有正确波形才可以粗步判断SPI工作了。如果MOSI都没波形,那估计是哪里初始化有问题。
xinjitmzy
2楼-- · 2019-03-24 01:43
spi有什么比较方便的 调试工具
foreng
3楼-- · 2019-03-24 03:01
 精彩回答 2  元偷偷看……
panfan
4楼-- · 2019-03-24 08:08
LZ问题解决了没有???

一周热门 更多>