社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 5371|回复: 4

[求助] STM32中SPI数据传输问题

[复制链接]

6

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2012-12-5 17:55:06 | 显示全部楼层 |阅读模式
我在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;

}

以上是我的部分程序。谢谢啦!!!!
此帖出自stm32/stm8论坛


回复

使用道具 举报

2470

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2012-12-5 22:05:19 | 显示全部楼层
要看看MOSI和MISO都有正确波形才可以粗步判断SPI工作了。如果MOSI都没波形,那估计是哪里初始化有问题。


回复

使用道具 举报

291

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2012-12-6 09:10:19 | 显示全部楼层
spi有什么比较方便的 调试工具


回复

使用道具 举报

3

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2012-12-8 16:57:56 | 显示全部楼层

这个应该是你程序问题

这个AD要第一次读的是上一个通道的装换数据,这点需要注意。还有就是在AD装换完后,一定要再读一次SPI寄存器。我今年刚用过这个方案。可以进一步交流


回复

使用道具 举报

5

TA的帖子

1

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2014-12-2 11:26:33 | 显示全部楼层
LZ问题解决了没有???


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-11-19 14:35 , Processed in 0.352788 second(s), 16 queries , Redis On.

快速回复 返回顶部 返回列表