[STM32F0] 21这么多高手没人愿意帮忙吗stm32f030c8t6 spi的问题

[复制链接]
4976|13
手机看帖
扫描二维码
随时随地手机跟帖
z32437089|  楼主 | 2014-8-26 22:48 | 显示全部楼层 |阅读模式
本帖最后由 z32437089 于 2014-8-30 21:55 编辑

大家好,调试STM32F030C8的时候出现问题,一直无法解决


开发环境COIDE 1.77

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
}
}


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

发现好像是最后10个BIT的前8个BIT剪下来放到最前面就对了。实在搞不清什么问题了,就这么一个问题反反复复搞了好几天了还是这样。
各路大神请指导一下,ST的FAE也请帮帮忙,在此感谢
z32437089|  楼主 | 2014-8-27 10:55 | 显示全部楼层
MASTER模式下用SPI2测试发送没问题,就是用从机模式发送的时候不对。

使用特权

评论回复
z32437089|  楼主 | 2014-8-30 21:54 | 显示全部楼层
21这么多高手,没人愿意帮忙吗

使用特权

评论回复
mmuuss586| | 2014-8-30 22:17 | 显示全部楼层
从模式,CLK应该也是主机发,你用PWM触发;
时序上很难匹配上,比较容易错位吧;
PWM触发,你CLK发送的个数肯定是多发的;

还不如IO模拟,还可以精确控制CLK的个数和时序;

使用特权

评论回复
z32437089|  楼主 | 2014-8-31 13:25 | 显示全部楼层
mmuuss586 发表于 2014-8-30 22:17
从模式,CLK应该也是主机发,你用PWM触发;
时序上很难匹配上,比较容易错位吧;
PWM触发,你CLK发送的个数 ...

你好,谢谢回复,CLK没有多发,逻辑分析仪检测CLK数量正确,

使用特权

评论回复
z32437089|  楼主 | 2014-8-31 13:49 | 显示全部楼层
mmuuss586 发表于 2014-8-30 22:17
从模式,CLK应该也是主机发,你用PWM触发;
时序上很难匹配上,比较容易错位吧;
PWM触发,你CLK发送的个数 ...

好像是CLK多发了,刚才用IO模拟了一下CLK,数据正确了,那我得改CLK了,必须得用PWM。。。谢谢谢谢

使用特权

评论回复
gxliu08| | 2014-8-31 15:03 | 显示全部楼层
学习学习,积累经验

使用特权

评论回复
mmuuss586| | 2014-8-31 22:52 | 显示全部楼层
z32437089 发表于 2014-8-31 13:49
好像是CLK多发了,刚才用IO模拟了一下CLK,数据正确了,那我得改CLK了,必须得用PWM。。。谢谢谢谢 ...

那PWM部分要好好控制了;
如果允许的话,就降低PWM频率,这样发送的个数相对好控制;

使用特权

评论回复
z32437089|  楼主 | 2014-9-7 20:06 | 显示全部楼层
本帖最后由 z32437089 于 2014-9-7 20:22 编辑
mmuuss586 发表于 2014-8-31 22:52
那PWM部分要好好控制了;
如果允许的话,就降低PWM频率,这样发送的个数相对好控制; ...

跟PWM频率无关,降低到400K还是出现乱码。。。
while(!(SPI1->SR & SPI_SR_TXE));SPI有比这句话提前一个CLK周期的判断语句吗

使用特权

评论回复
z32437089|  楼主 | 2014-9-7 20:07 | 显示全部楼层
PWM才800KHZ,不算太高啊

使用特权

评论回复
z32437089|  楼主 | 2014-9-7 23:45 | 显示全部楼层
mmuuss586 发表于 2014-8-31 22:52
那PWM部分要好好控制了;
如果允许的话,就降低PWM频率,这样发送的个数相对好控制; ...

你好,我后面做了个测试,PWM打开占空比,固定延时,然后关闭占空比,为什么这么简单的测试都能发现PWM脉冲数量不一样。。。我没招了。。TIM打开preload了。
TIM1->CCR2=Channel2Pulse;
systickdelay(438);
TIM1->CCR2=0;

使用特权

评论回复
huzi2099| | 2014-9-8 11:53 | 显示全部楼层
z32437089 发表于 2014-9-7 23:45
你好,我后面做了个测试,PWM打开占空比,固定延时,然后关闭占空比,为什么这么简单的测试都能发现PWM脉 ...

延时被中断打乱了

使用特权

评论回复
z32437089|  楼主 | 2014-9-8 12:24 | 显示全部楼层
mmuuss586 发表于 2014-8-31 22:52
那PWM部分要好好控制了;
如果允许的话,就降低PWM频率,这样发送的个数相对好控制; ...

哦,知道怎么回事了,每次启动占空比的时候TIM counter的值都不相同,所以采用固定延时并不能得到固定数量的周期,一个前半周一个后半周这样就会相差一个CLK了,启动占空比之前加一个判断就可以了,问题解决,谢谢!!

使用特权

评论回复
mmuuss586| | 2014-9-8 20:24 | 显示全部楼层
解决了,感谢分享经验;
你这几天都不休息啊;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则