OpenEdv-开源电子网

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

STM32F103ZET6 SPI 16位模式 控制MC33879通讯不成功,总是收到65534?

[复制链接]

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-4-14
在线时间
1 小时
发表于 2014-5-27 14:41:33 | 显示全部楼层 |阅读模式
5金钱

RT,求大大门帮帮忙,网上也没有相关可以参考的东西,使用SPI3,对应PB3,4,5;cs信号使PG6

mc33879是一个IO芯片,时序我看了,的确是空闲SCK低,第二个SCKt跳边沿传输数据。

要求是16位的命令 ,我就设置SPI3为16位的,

GPIO_InitTypeDef GPIO_InitStructure;
 SPI_InitTypeDef SPI_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG,ENABLE);
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
 
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_Init(GPIOB,&GPIO_InitStructure);
 GPIO_ResetBits(GPIOB,GPIO_Pin_3);
 GPIO_SetBits(GPIOB,GPIO_Pin_4|GPIO_Pin_5);
 
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
 GPIO_InitStructure.GPIO_Pin=GPIO_Mode_Out_PP;
 GPIO_Init(GPIOG,&GPIO_InitStructure);
GPIO_SetBits(GPIOG,GPIO_Pin_6);   //cs
 
 
 SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
 SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
 SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b;
 SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
 SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;
 SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
 SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_16;
 SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
 SPI_InitStructure.SPI_CRCPolynomial=7;
 SPI_Init(SPI3,&SPI_InitStructure);
 SPI_Cmd(SPI3,ENABLE);
 MC33879_SPI3_WriteRead2Bytes(0xffff);
 
}

u16 MC33879_SPI3_WriteRead2Bytes(u16 TxData)
{
 u8 retry=0;
 while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE)==RESET)
 {
  retry++;
  if(retry>200)
  {printf("SEND failed\r\n"); return 0;}
  
 }
 SPI_I2S_SendData(SPI3,TxData);
 retry=0;
 while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE)==RESET)
 {
  retry++;
  if(retry>200)
   {printf("Receive failed\r\n"); return 0;}
 }
 return SPI_I2S_ReceiveData(SPI3);
}

void MC33879_WriteRead2Bytes(u16 TxData)
{
 GPIO_ResetBits(GPIOG,GPIO_Pin_6);
 MC33879_STATUS=MC33879_SPI3_WriteRead2Bytes(TxData);
 delay_ms(5);
 //printf("Getstatus %d\r\n",MC33879_STATUS);
 //MC33879_CS_High;
 GPIO_SetBits(GPIOG,GPIO_Pin_6);
}

void MC33879_Init(void)
{
 MC33879_STATUS=0X00;
 printf("Init MC33879_STATUS to %d\r\n",MC33879_STATUS);
 MC33879_SPI3_Init();
 MC33879_WriteRead2Bytes(0x0002);
 printf("First cmd Return %d\r\n",MC33879_STATUS);
 MC33879_WriteRead2Bytes(0x0002);
 printf("Second cmd Return %d\r\n",MC33879_STATUS);
}


可是串口输出的数据一直是65534阿,MC33879的数据手册上说,发送一个16位命令就会返回一个16位状态值,初始化要发两次,第二次的作为正式命令接受,

返回的16位状态值,高8位肯定是0阿。

不知道怎么搞了呢,



QQ截图20140527144026.png
QQ截图20140527144011.png

最佳答案

查看完整内容[请看2#楼]

回复【4楼】正点原子: --------------------------------- 谢谢原子哥, SPI的问题解决了一点,驱动芯片的代码正在调试中。 SPI不能正常通讯的原因是SPI3 使用的IO口PB3,PB4,PB5,其中PB3也就是 SCK3,和JTAG引脚冲突, 默认PB3是不受控制器控制的,必须关了JTAG才行,也就是我在初始化SPI3的开头加了两句话: RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE );//PORTB?±???? ...
我可以一辈子都呆在家里不出来么?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-4-14
在线时间
1 小时
 楼主| 发表于 2014-5-27 14:41:34 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
谢谢原子哥,
SPI的问题解决了一点,驱动芯片的代码正在调试中。
SPI不能正常通讯的原因是SPI3 使用的IO口PB3,PB4,PB5,其中PB3也就是 SCK3,和JTAG引脚冲突,
默认PB3是不受控制器控制的,必须关了JTAG才行,也就是我在初始化SPI3的开头加了两句话:
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE );//PORTB?±?????? 
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI3,  ENABLE );//SPI3?±?????? 
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

首先是开启了AFIO时钟,因为要用Remap重映射了,然后就是最下面一句,关掉JTAG。
其实本质上也不是太懂,都是从网上找来的。
我可以一辈子都呆在家里不出来么?
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-4-14
在线时间
1 小时
 楼主| 发表于 2014-5-27 14:44:45 | 显示全部楼层



我可以一辈子都呆在家里不出来么?
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-4-14
在线时间
1 小时
 楼主| 发表于 2014-5-27 14:45:24 | 显示全部楼层
抱歉把图片弄成附件了,这时datasheet上的几句话,
求大家帮我看看我的SPI哪里弄错了
我可以一辈子都呆在家里不出来么?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-27 23:21:10 | 显示全部楼层
把SPI_CPOL和SPI_CPHA这两个参数,改改试试吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-29 00:05:48 | 显示全部楼层
回复【5楼】杨帆:
---------------------------------
谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-4-14
在线时间
1 小时
 楼主| 发表于 2014-5-29 09:01:11 | 显示全部楼层

板子上两个SPI的外设调通了,呵呵,心情不错,我上传下MC33879

这款IC的驱动测试程序把,也好大家有个参考,我在网上想搜个参考都没有。

SPI_MC33879.zip

4.52 MB, 下载次数: 5185

我可以一辈子都呆在家里不出来么?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-29 23:23:04 | 显示全部楼层
回复【7楼】杨帆:
---------------------------------
谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-8-5
在线时间
0 小时
发表于 2014-8-5 19:22:39 | 显示全部楼层
这种方式确定可以调通吗?貌似不行?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 11:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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