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

STM32F030C8的spi问题

[复制链接]
z32437089 提问时间:2014-8-26 23:08 /
 大家好,调试STM32F030C8的时候出现问题,一直无法解决
SPI工作模式,从机状态下发送数据,数据帧大小8 Bits,时钟来源来自自身TIM1CH2产生的PWM。
SPI1的CS接GND,CLK接PA9(TIM1_CH2)
问题描述,从机发送数据,用逻辑分析仪捕捉发现与发送的不符,好像是错位的感觉。
SPI初始化部分
       
  • void spiinit()   
  • {   
  • GPIO_InitTypeDef GPIO_InitStructure;   
  • SPI_InitTypeDef SPI_InitStructure;   
  • SPI_I2S_DeInit(SPI1);   
  •     
  • RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);   
  • GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;   
  • GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
  • GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;  //IO速度50MHZ   
  • GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;   
  • GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;   
  • GPIO_Init(GPIOA, &GPIO_InitStructure);   
  •     
  • GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);   
  • GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);   
  • GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);   
  •     
  • RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);   
  •     
  •     
  • SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;  //单线发送模式   
  • SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;                  //从机模式   
  • SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;           //数据帧8Bits   
  • SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                  //空闲时钟状态低电平   
  • SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;               //第一个边缘改变数值   
  • SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;   
  • // SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;   
  • SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                 
  • // SPI_InitStructure.SPI_CRCPolynomial = 7;   
  •     
  • SPI_Init(SPI1, &SPI_InitStructure);   
  •     
  • SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);   
  •     
  • //SPI_CalculateCRC(SPI1, DISABLE);   
  • SPI_Cmd(SPI1, ENABLE);   
  • }   
  •     
  • void send8(uint8_t dat)   
  • {   
  •     
  • while(!(SPI1->SR & SPI_SR_TXE));         //等待直到发送缓存区为空   
  •     
  • *(__IO uint8_t *) (0x4001300C)=dat;  // 0x4001300C为 SPI1->DR偏移地址   
  •     
  • TIM1->CCR2=Channel2Pulse;//使能PWM输出占空比50%   
  • }   
  •     
  • void main(void)   
  • {   
  • volatile uint32_t i;   
  • SystemInit();   
  • spiint();   
  • while(1)   
  •     {   
  •      for (i = 0; i < 0x055ff; i++);//delay   
  •     
  • send8(0x01);send8(0x03);send8(0x07);send8(0x0f);  //循环发送01,03,07,0F   
  • while(!(SPI1->SR & SPI_SR_TXE));   
  • TIM1->CCR2=0;//change duty to 0,change clk to low level也就是disable spi clk   
  • }   
  • }

[color=#000099 !important]复制代码



程序循环发送01,03,07,0F,得到的数据不对。看逻辑分析仪捕捉。

发现好像是最后10个BIT的前8个BIT剪下来放到最前面就对了。实在搞不清什么问题了,就这么一个问题反反复复搞了好几天了还是这样。
各路大神请指导一下,ST的FAE也请帮帮忙,在此感谢
收藏 评论4 发布时间:2014-8-26 23:08

举报

4个回答
回答时间:2014-8-27 09:11:08

RE:STM32F030C8的spi问题

为什么CS不用SPI模块本身自带的?建议先发送clk,然后再发送数据
z32437089 回答时间:2014-8-27 09:33:39

回复:STM32F030C8的spi问题

回复第 2 楼 于2014-08-27 09:11:08发表:
为什么CS不用SPI模块本身自带的?建议先发送clk,然后再发送数据
 
谢谢,试了一下,还是跟以前一样,想想也应该没什么区别,从机模式发送,没有CLK,缓存区里面的数据不会发送的
 
回答时间:2014-8-27 11:04:41

RE:STM32F030C8的spi问题

从机模式,主机会提供CLK的。
z32437089 回答时间:2014-8-27 12:32:41

回复:STM32F030C8的spi问题

回复第 4 楼 于2014-08-27 11:04:41发表:
从机模式,主机会提供CLK的。
我没有主机,因为需要同步,所以必须使用从机模式由TIM提供CLK,这个CLK还有其他用途
 
用在主机模式时发送的数据是正确的,用从机对外发送就不对,就相当于当主机读我这个SPI口的时候,我返回的数据乱码错误。
 

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版