OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6171|回复: 5

用stm32的SPI与ADS8341通信

[复制链接]

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-4-15
在线时间
0 小时
发表于 2013-4-16 18:43:11 | 显示全部楼层 |阅读模式

大家好!我用stm32的SPI与ADS8341通信,仿真了一下,发现从机无法接收到时钟脉冲,控制ADS8341的控制字也无法传给ADS8341,SPI的初始化,我是根据例程写的,请大家帮我看看问题出在哪了,谢谢!
void SPI2_Init(void)
{
 RCC->APB2ENR|=1<<3;    //PORTB时钟使能
 RCC->APB1ENR|=1<<14;   //SPI2时钟使能

 GPIOB->CRH&=0X0000FFFF;
 GPIOB->CRH|=0XBBB30000;
 GPIOB->ODR|=0X7<<13;
 SPI2->CR1|=0<<10;  //全双工模式
 SPI2->CR1|=1<<9;   //软件nss管理
 SPI2->CR1|=1<<8;  

 SPI2->CR1|=1<<2; //SPI主机
 SPI2->CR1|=0<<11; //8位数据
 SPI2->CR1|=0<<1; //CPOL=0
 SPI2->CR1|=0<<0;  //CPHA=0
 SPI2->CR1|=7<<3;  //Fsck=Fcpu/256
 SPI2->CR1|=0<<7;   //MSBfirst
 SPI2->CR1|=1<<6;    //SPI设备使能
 SPI2_ReadWriteByte(0xff); //启动传输
 
}
还有初始化中的SPI2->CR1|=7<<3;  与//SPI速度设置函数
有什么关系?
void SPI2_SetSpeed(u8 SpeedSet)
{
  SpeedSet&=0x07;
  SPI2->CR1&=0xFFC7;
  SPI2->CR1|=SpeedSet<<3;
  SPI2->CR1|=1<<6;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-16 23:15:57 | 显示全部楼层
设置没问题啊,输出时钟肯定应该有才对.
怀疑你测试方法有问题/测试代码有问题.
你试试在main函数里面写成:
while(1)
{
 SPI2_ReadWriteByte(0xAA); //不停发送数据
}
再看看时钟!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-4-15
在线时间
0 小时
 楼主| 发表于 2013-4-18 16:53:20 | 显示全部楼层
好,我试试!有问题了再请教你,谢谢!
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-4-15
在线时间
0 小时
 楼主| 发表于 2013-4-18 18:28:54 | 显示全部楼层
你好!我试了一下,所有和SPI2有关的引脚都一直是低电频,我看到读写FLASH的程序中说为了防止SD卡影响FLASH的烧写,把SD卡对应的CS引脚拉高了,我把ADS的CS引脚按照例子中的方法设置成了PB11(#define SPI_ADS_CS Bout(11)),请问这样是否正确?但是这样设置好像不起任何作用。我把我写的程序附在后面请您帮我看看,谢谢!
#include <stm32f10x_lib.h>
#include"spi.h"
//SPI口初始化
void SPI2_Init(void)
{
 RCC->APB2ENR|=1<<3;    //PORTB时钟使能
 RCC->APB1ENR|=1<<14;   //SPI2时钟使能

 GPIOB->CRH&=0X000FFFFF;
 GPIOB->CRH|=0XBBB00000;
 GPIOB->ODR|=0X7<<13;
 SPI2->CR1|=0<<10;  //全双工模式
 SPI2->CR1|=1<<9;   //软件nss管理
 SPI2->CR1|=1<<8;   

 SPI2->CR1|=1<<2; //SPI主机
 SPI2->CR1|=0<<11; //8位数据
 SPI2->CR1|=0<<1; //CPOL=0
 SPI2->CR1|=0<<0;  //CPHA=0
 SPI2->CR1|=3<<3;  //Fsck=Fcpu/256
 SPI2->CR1|=0<<7;   //MSBfirst
 SPI2->CR1|=1<<6;    //SPI设备使能
 SPI2_ReadWriteByte(0xff); //启动传输
 
}
//SPI速度设置函数
void SPI2_SetSpeed(u8 SpeedSet)
{
  SpeedSet&=0x07;
  SPI2->CR1&=0xFFC7;
  SPI2->CR1|=SpeedSet<<3;
  SPI2->CR1|=1<<6;
}
//SPI2读写一个字节
//TxData:要写入的字节
//返回值:要读到的字节
u8 SPI2_ReadWriteByte(u8 TxData)
{
 u16 retry;
 while((SPI2->SR&1<<1)==0)   //等待发送区空
 {
  retry++;
  if(retry>=0xfffe)
   return 0;
 }
 SPI2->DR=TxData;   //发送一个字节
 retry=0;
 while((SPI2->SR&1<<0)==0)       //等待接收完一个字节
 {
  retry++;
  if(retry>=0xfffe)
   return 0;
 }
 return SPI2->DR;     //返回收到的数据

}
      
#include <stm32f10x_lib.h>    
#include "IO.h"
#include "spi.h"
void SPI_ADS_Init(void)
{
 RCC ->APB2ENR|=1<<2;   //使能PORTA时钟
 RCC ->APB2ENR|=1<<3;   //使能PORTB时钟
 RCC ->APB2ENR|=1<<5;   //使能PORTD时钟
 RCC ->APB2ENR|=1<<8;   //使能PORTG时钟

 GPIOA->CRL&=0XFF0F0FFF;
 GPIOA->CRL|=0X00303000;

 GPIOD->CRL&=0XFFFFF0FF;
 GPIOD->CRL|=0X00000300;
 GPIOD->ODR|=1<<2;    //PD2上拉

 GPIOB->CRH&=0XFFF00FFF;
 GPIOB->CRH|=0X00033000;
 GPIOB->ODR|=1<<11;  //PB11上拉
 GPIOB->ODR|=1<<12;  //PB12上拉

 GPIOG->CRL&=0X0FFFFFFF;
 GPIOG->CRL|=0X30000000;
 GPIOG->ODR|=1<<7;     //PG7上拉

 SPI2_Init();
 SPI2_SetSpeed(SPI_SPEED_32);
}
void delay1(u16 ms) 

 u8 i; 
  while(ms--) 
 { 
   for(i = 0; i<250; i++); 
 } 
}

 
void sendch(u8 t)
{
 USART1->DR=t;
 while((USART1->SR&0X40)==0);
 USART1->SR&=0XFF7F;
 
}     
void spi_ads8341(void)
{
 u8 a1,a2,a3;
 SPI_ADS_CS=0; 
 SPI2_ReadWriteByte(0x94);
 a1=SPI2_ReadWriteByte(0x90);      
 a2=SPI2_ReadWriteByte(0x90);      
 a3=SPI2_ReadWriteByte(0x90);  
    SPI_ADS_CS=1;
 sendch(a1);
 sendch(a2);
 sendch(a3);
 delay1(5000);
}                 

#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"  
#include "delay.h" 
#include "spi.h" 
#include "IO.h"
//ADS8341实验
int main(void)

 Stm32_Clock_Init(9); //系统时钟设置
 delay_init(72);      //延时初始化
 uart_init1(72,9600); 
 while(1)           
 {
  //spi_ads8341();
  SPI2_ReadWriteByte(0xAA);
 }  
}



这是ADS8341的时序图 


--------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-18 23:22:30 | 显示全部楼层
回复【4楼】helen:
---------------------------------
宏定义没错,不过貌似没看到你初始化PB11啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-4-15
在线时间
0 小时
 楼主| 发表于 2013-4-21 09:38:05 | 显示全部楼层
PB11初始化了,在IO.c中初始化了
#include <stm32f10x_lib.h>    
#include "IO.h"
#include "spi.h"
void SPI_ADS_Init(void)
{
RCC ->APB2ENR|=1<<2;  //使能PORTA时钟
RCC ->APB2ENR|=1<<3;  //使能PORTB时钟
RCC ->APB2ENR|=1<<5;  //使能PORTD时钟
RCC ->APB2ENR|=1<<8;  //使能PORTG时钟

GPIOA->CRL&=0XFF0F0FFF;
GPIOA->CRL|=0X00303000;

GPIOD->CRL&=0XFFFFF0FF;
GPIOD->CRL|=0X00000300;
GPIOD->ODR|=1<<2;   //PD2上拉

GPIOB->CRH&=0XFFF00FFF;
GPIOB->CRH|=0X00033000;
GPIOB->ODR|=1<<11; //PB11上拉
GPIOB->ODR|=1<<12; //PB12上拉

GPIOG->CRL&=0X0FFFFFFF;
GPIOG->CRL|=0X30000000;
GPIOG->ODR|=1<<7;    //PG7上拉

SPI2_Init();
SPI2_SetSpeed(SPI_SPEED_32);
}
void delay1(u16 ms) 

 u8 i; 
  while(ms--) 
 { 
   for(i = 0; i<250; i++); 
 } 
}


void sendch(u8 t)
{
USART1->DR=t;
while((USART1->SR&0X40)==0);
USART1->SR&=0XFF7F;

}    
void spi_ads8341(void)
{
u8 a1,a2,a3;
SPI_ADS_CS=0; 
SPI2_ReadWriteByte(0x94);
a1=SPI2_ReadWriteByte(0x90);      
a2=SPI2_ReadWriteByte(0x90);      
a3=SPI2_ReadWriteByte(0x90);  
    SPI_ADS_CS=1;
sendch(a1);
sendch(a2);
sendch(a3);
delay1(5000);
}  
#include <stm32f10x_lib.h>
#include"spi.h"
//SPI口初始化
void SPI2_Init(void)
{
RCC->APB2ENR|=1<<3;    //PORTB时钟使能
RCC->APB1ENR|=1<<14;   //SPI2时钟使能

GPIOB->CRH&=0X000FFFFF;
GPIOB->CRH|=0XBBB00000;
GPIOB->ODR|=0X7<<13;
SPI2->CR1|=0<<10;  //全双工模式
SPI2->CR1|=1<<9;   //软件nss管理
SPI2->CR1|=1<<8;   

SPI2->CR1|=1<<2; //SPI主机
SPI2->CR1|=0<<11; //8位数据
SPI2->CR1|=0<<1; //CPOL=0
SPI2->CR1|=0<<0;  //CPHA=0
SPI2->CR1|=3<<3;  //Fsck=Fcpu/256
SPI2->CR1|=0<<7;   //MSBfirst
SPI2->CR1|=1<<6;   //SPI设备使能
SPI2_ReadWriteByte(0xff); //启动传输

}
//SPI速度设置函数
void SPI2_SetSpeed(u8 SpeedSet)
{
 SpeedSet&=0x07;
 SPI2->CR1&=0xFFC7;
 SPI2->CR1|=SpeedSet<<3;
 SPI2->CR1|=1<<6;
}
//SPI2读写一个字节
//TxData:要写入的字节
//返回值:要读到的字节
u8 SPI2_ReadWriteByte(u8 TxData)
{
u16 retry;
while((SPI2->SR&1<<1)==0)   //等待发送区空
{
retry++;
if(retry>=0xfffe)
return 0;
}
SPI2->DR=TxData; //发送一个字节
retry=0;
while((SPI2->SR&1<<0)==0)       //等待接收完一个字节
{
retry++;
if(retry>=0xfffe)
return 0;
}
return SPI2->DR;    //返回收到的数据

}
  
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "spi.h" 
#include "IO.h"
//ADS8341实验
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);      //延时初始化
uart_init1(72,9600);
while(1)    
{
//spi_ads8341();
SPI2_ReadWriteByte(0xAA);
}  
}
这是新改的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-21 02:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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