OpenEdv-开源电子网

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

关于STM32F1的SPI通信问题

[复制链接]

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-3-5
在线时间
10 小时
发表于 2019-9-24 17:14:11 | 显示全部楼层 |阅读模式
利用SPI与ws1850通信,基础配置如下:系统时钟72M
oid SPI1_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTBʱÖÓʹÄÜ
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//PORTBʱÖÓʹÄÜ
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1,  ENABLE );//SPI1ʱÖÓʹÄÜ  

  /*!< Configure pins: SCK */   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);     
  /*!< Configure pins: MISO */   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);     
  /*!< Configure pins: MOSI */   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);     
  /*!< Configure pins: CS */   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  GPIO_Init(GPIOB, &GPIO_InitStructure);

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //&Eacute;è&Ouml;&Atilde;SPI&micro;&yen;&Iuml;ò&raquo;ò&Otilde;&szlig;&Euml;&laquo;&Iuml;ò&micro;&Auml;&Ecirc;&yacute;&frac34;&Yacute;&Auml;&pound;&Ecirc;&frac12;:SPI&Eacute;è&Ouml;&Atilde;&Icirc;&ordf;&Euml;&laquo;&Iuml;&szlig;&Euml;&laquo;&Iuml;ò&Egrave;&laquo;&Euml;&laquo;&sup1;¤
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;  //&Eacute;è&Ouml;&Atilde;SPI&sup1;¤×÷&Auml;&pound;&Ecirc;&frac12;:&Eacute;è&Ouml;&Atilde;&Icirc;&ordf;&Ouml;÷SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;  //&Eacute;è&Ouml;&Atilde;SPI&micro;&Auml;&Ecirc;&yacute;&frac34;&Yacute;&acute;ó&ETH;&iexcl;:SPI·&cent;&Euml;&Iacute;&frac12;&Oacute;&Ecirc;&Otilde;8&Icirc;&raquo;&Ouml;&iexcl;&frac12;á&sup1;&sup1;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;  //&acute;&reg;&ETH;&ETH;&Iacute;&not;&sup2;&frac12;&Ecirc;±&Ouml;&Oacute;&micro;&Auml;&iquest;&Otilde;&Iuml;&ETH;×&acute;&Igrave;&not;&Icirc;&ordf;&cedil;&szlig;&micro;&ccedil;&AElig;&frac12;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //&acute;&reg;&ETH;&ETH;&Iacute;&not;&sup2;&frac12;&Ecirc;±&Ouml;&Oacute;&micro;&Auml;&micro;&Uacute;&para;&thorn;&cedil;&ouml;&Igrave;&oslash;±&auml;&Ntilde;&Oslash;&pound;¨&Eacute;&Iuml;&Eacute;&yacute;&raquo;ò&Iuml;&Acirc;&frac12;&micro;&pound;&copy;&Ecirc;&yacute;&frac34;&Yacute;±&raquo;&sup2;&Eacute;&Ntilde;ù
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;  //NSS&ETH;&Aring;&ordm;&Aring;&Oacute;&Eacute;&Oacute;&sup2;&frac14;&thorn;&pound;¨NSS&sup1;&Uuml;&frac12;&Aring;&pound;&copy;&raquo;&sup1;&Ecirc;&Ccedil;&Egrave;í&frac14;&thorn;&pound;¨&Ecirc;&sup1;&Oacute;&Atilde;SSI&Icirc;&raquo;&pound;&copy;&sup1;&Uuml;&Agrave;í:&Auml;&Uacute;&sup2;&iquest;NSS&ETH;&Aring;&ordm;&Aring;&Oacute;&ETH;SSI&Icirc;&raquo;&iquest;&Oslash;&Ouml;&AElig;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;  //&para;¨&Ograve;&aring;&sup2;¨&Igrave;&Oslash;&Acirc;&Ecirc;&Ocirc;¤·&Ouml;&AElig;&micro;&micro;&Auml;&Ouml;&micro;:&sup2;¨&Igrave;&Oslash;&Acirc;&Ecirc;&Ocirc;¤·&Ouml;&AElig;&micro;&Ouml;&micro;&Icirc;&ordf;256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //&Ouml;&cedil;&para;¨&Ecirc;&yacute;&frac34;&Yacute;&acute;&laquo;&Ecirc;&auml;&acute;&Oacute;MSB&Icirc;&raquo;&raquo;&sup1;&Ecirc;&Ccedil;LSB&Icirc;&raquo;&iquest;&ordf;&Ecirc;&frac14;:&Ecirc;&yacute;&frac34;&Yacute;&acute;&laquo;&Ecirc;&auml;&acute;&Oacute;MSB&Icirc;&raquo;&iquest;&ordf;&Ecirc;&frac14;
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC&Ouml;&micro;&frac14;&AElig;&Euml;&atilde;&micro;&Auml;&para;à&Iuml;&icirc;&Ecirc;&frac12;
SPI_Init(SPI1, &SPI_InitStructure);  //&cedil;ù&frac34;&Yacute;SPI_InitStruct&Ouml;&ETH;&Ouml;&cedil;&para;¨&micro;&Auml;&sup2;&Icirc;&Ecirc;&yacute;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;&Iacute;&acirc;&Eacute;èSPIx&frac14;&Auml;&acute;&aelig;&AElig;÷

SPI_Cmd(SPI1, ENABLE); //&Ecirc;&sup1;&Auml;&Uuml;SPI&Iacute;&acirc;&Eacute;è
//SPI2_ReadWriteByte(0xff);//&AElig;&ocirc;&para;&macr;&acute;&laquo;&Ecirc;&auml;

SPI1_SetSpeed(SPI_BaudRatePrescaler_256);
     
// GPIO_ResetBits(PINB,CS);   
// delay_us(10);
// GPIO_SetBits(PINB,CS);
// delay_us(10);

}   
!!问题在于,读取SPI数据的时候,我得先读取两次空值(0),第三次读取才是正确的值,这是为什么?!!
读取函数如下:

unsigned char ReadRawRC(unsigned char Address)
{
  unsigned char ucAddr;
  unsigned char ucResult=0,h,l;
  GPIO_ResetBits(PINB,CS);
  ucAddr = ((Address<<1)&0x7E)|0x80;

  SPI_I2S_SendData(SPI1,ucAddr);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, 0xff);
h=SPI_I2S_ReceiveData(SPI1);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
l=SPI_I2S_ReceiveData(SPI1);//红色部分不可删去,否则数据读取出错,至于怎么确定是对的数值,我先往该寄存器写入,然后再读取。


while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
ucResult=SPI_I2S_ReceiveData(SPI1);
  GPIO_SetBits(PINB,CS);
  return ucResult;
}
顺便附上写入函数:
void WriteRawRC(unsigned char Address, unsigned char value)
{  
  unsigned char ucAddr;
GPIO_ResetBits(PINB,CS);
  ucAddr = ((Address<<1)&0x7E);
SPI_I2S_SendData(SPI1,ucAddr);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

  SPI_I2S_SendData(SPI1, value);
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
  GPIO_SetBits(PINB,CS);
}

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

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-3-5
在线时间
10 小时
 楼主| 发表于 2019-9-24 17:17:49 | 显示全部楼层
之前和2.4G模块通信,也是同样问题,要先读取两次没有关联的值,然后第三次才是对的。
回复 支持 反对

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14424
金钱
14424
注册时间
2018-8-3
在线时间
1157 小时
发表于 2019-9-24 21:50:41 | 显示全部楼层
你试下用原子的驱动代码 看看有这个情况吗
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 02:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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