你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 F030 SPI

[复制链接]
wenzh00808ongzi 提问时间:2014-12-15 09:31 /
本帖最后由 wenzh00808ongzi 于 2014-12-15 09:54 编辑

void SPI_CONFIG(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOC|RCC_AHBPeriph_GPIOF,ENABLE);
SPI_InitTypeDef  SPI_InitStructure;
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_0);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
//SPI
/* SPI SCK pin configuration PA5 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* SPI  MOSI pin configuration PA6 */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* SPI MISO pin configuration PA7*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
//GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
//spi cs PA4
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_SetBits(GPIOA, GPIO_Pin_4);  //ÐèÒªÔÚÆ¬Ñ¡¿ªÊ¼Öà 0
/* SPI configuration -------------------------------------------------------*/
  SPI_I2S_DeInit(SPI1);
SPI_Cmd(SPI1, DISABLE);            
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;  //
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//
  SPI_InitStructure.SPI_CRCPolynomial = 7;//
SPI_Init(SPI1, &SPI_InitStructure);
  SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
  SPI_Cmd(SPI1, ENABLE);/* Enable SPI*/
  SPI_SSOutputCmd(SPI1, ENABLE);
}

void Thm_3060_Spi_Cs(u8 i)
{
  if(i==0) GPIO_ResetBits(GPIOA, GPIO_Pin_4);
  else GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
void Write_1_Byte(unsigned short reg, unsigned char dat)
{
/* Set  SCS Low */
Thm_3060_Spi_Cs(0);
/* Write Address */
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_SendData8(SPI1,reg);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_SendData8(SPI1,dat);
/* Set  SCS High */
Thm_3060_Spi_Cs(1);
}
unsigned char Read_1_Byte(unsigned short reg)
{
unsigned char i;
/* Set SCS Low */
Thm_3060_Spi_Cs(0);
/* Write Address */
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_SendData8(SPI1,reg);
/* Read 1 byte */
//while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
// SPI_SendData8(SPI1,reg);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
i=SPI_ReceiveData8(SPI1);
/* Set SCS High*/
Thm_3060_Spi_Cs(1);
return i;
}
程序调用不会卡死,就是spi读取不到数据?配置有什么问题?还是收发有问题?还是库有问题?求正确历程,工程文件。

收藏 评论18 发布时间:2014-12-15 09:31

举报

18个回答
wambob 回答时间:2014-12-16 20:56:42
SPI协议是主从模式:从机不主动发起访问,总是被动执行操作。
CSN:片选信号。
SCK:时钟信号。
MOSI:master output slave input,即主机输出从机输入。可以理解主机写从设备。
MISO:master input slave output,即主机输入从机输出。可以理解主机读从设备。

SPI协议自然是串行地传输数据,每次按 1 bit读写设备,而不是并行每次1byte(8bit)传输。

读不出数据 的话,先看程序是否正确,对照时序图查看一下程序.按照读写时序输出字节(MOSI)就会从MSB 循环输出,同将输入字节(MISO)从LSB 循环移入,每次移动一位。



wenzh00808ongzi 回答时间:2014-12-15 09:37:08
与stm32f030接口的片子spi时序图.
QQ图片20141215093515.png
沐紫 回答时间:2014-12-15 09:41:51
楼主标题是不是写误了,F030?
wenzh00808ongzi 回答时间:2014-12-15 09:48:13
沐紫 发表于 2014-12-15 09:41
楼主标题是不是写误了,F030?

写错了,已经修改。
好心情123 回答时间:2014-12-16 11:57:45
楼主要用SPI读取什么设备,设局格式设置是否正确
Dylan疾风闪电 回答时间:2014-12-16 18:17:25
  1. /**
  2.   * <b>串行外设接口向从设备发送一个字节的数据。</b>
  3.   * @param  byte        待发送的字节</span>
  4.   * @return             从设备回传的字节
  5.   */
  6. u8 SpiTransaction(u8 byte)
  7. {
  8.   u8 spidata = 0;

  9.   while (!(SPI1->SR & 0x2));  // wait for transfer to complete
  10.   SPI_SendData8(SPI1, byte);//不用SPI1->DR = byte;  // write to buffer for TX
  11.   
  12.   while (!(SPI1->SR & 0x1)); //wait for received
  13.   spidata = SPI_ReceiveData8(SPI1);//不用spidata = SPI1->DR;  // read the received value

  14.   return spidata;
  15. }
复制代码


Dylan疾风闪电 回答时间:2014-12-16 18:22:35
读不到数据的时候,检查一下这些因素:
1.从设备的时序:SPI_CPOL 和 SPI_CPHA。
2.通讯速率,有的时候需要先低速验证一下通讯是否成功;因为高速通讯影响成功的因素较多。
3.有条件的情况下,使用示波器追踪通讯波形。
wambob 回答时间:2014-12-16 20:59:43
单字节读时序:

1./*

2.** 函数名 : SPI_Read_OneByte

3.** 返回值 : temp--SPI读取的一字节数据

4.** 参  数 : None

5.** 描  述 : 下降沿读数据,每次读取 1 bit

6.*/

7.uint8 SPI_Read_OneByte(void)

8.{

9.  uint8 i;

10.  uint8 temp = 0;

11.  

12.  for(i=0;i<8;i++)

13.  {

14.   temp <<= 1;       //读取MISO 8次输入的值,存入temp。之所以不放在“SCK = 0”语句之后的位置是因为:

15.                     //读取最后1byte的最后一位(即LSB)之后,不能再左移了

16.   SCK = 1;         

17.   if(MISO)          //读取最高位,保存至最末尾,通过左移位完成读整个字节

18.     temp |= 0x01;

19.    else

20.     temp &= ~0x01;

21.   SCK = 0;          //下降沿来了(SCK从1-->0),MISO上的数据将发生改变,稳定后读取存入temp
22.  }

23.  

24.  return temp;

25.}
单字节写时序:

1./*

2.** 函数名 : SPI_Write_OneByte

3.** 返回值 : None

4.** 参  数 : u8_writedata--SPI写入的一字节数据

5.** 描  述 : 上升沿写数据,每次写入 1 bit

6.*/

7.void SPI_Write_OneByte(uint8 u8_writedata)

8.{

9.  uint8 i;

10.  

11.  for(i=0;i<8;i++)

12.  {

13.    if(u8_writedata & 0x80)      //判断最高位,总是发送最高位

14.     MOSI_ON;                    //MOSI输出1,数据总线准备数据1

15.    else

16.     MOSI_OFF;                   //MOSI输出0,数据总线准备数据0
17.     

18.    SCK = 1;                     //上升沿来了(SCK从0-->1),数据总线上的数据写入到器件
19.    u8_writedata <<= 1;          //左移抛弃已经输出的最高位

20.    SCK = 0;                     //拉低SCK信号,初始化为0
21.  }

22.}
再根据使用的SPI器件可以写出
小贾-370388 回答时间:2014-12-16 22:21:29
看一下外部引脚连接是否正确,其次波特率是否正确
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版