stm32-STM32用MCP2515与另一块STM32通讯失败

问题描述

STM32用MCP2515与另一块STM32通讯失败 1C
大家,我最近在调试SPI转CAN模块MCP2515;我用jink查看配置寄存器,都没错,就是死活发不了数据,求助下大家;
MCP2515和STM32zet6的SPI2连接:
SPI程序设置为主机:
////////////////////////////////////////////////////////////////////////////////////////////////////
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;

    RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB ENABLE );//PORTB时钟使能     RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2  ENABLE );//SPI2时钟使能             GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    GPIO_Init(GPIOB &GPIO_InitStructure);//初始化GPIOB

// GPIO_SetBits(GPIOBGPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB13/14/15上拉

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工      SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //串行同步时钟的空闲状态为高电平    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始    SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;    SPI_Init(SPI2 &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器    SPI_Cmd(SPI2 ENABLE); //使能SPI外设    SPI2_ReadWriteByte(0xff);//启动传输                 

spi发送代码:
u8 retry=0;

while (SPI_I2S_GetFlagStatus(SPI2 SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}

SPI_I2S_SendData(SPI2 TxData); //通过外设SPIx发送一个数据
retry=0;

    while (SPI_I2S_GetFlagStatus(SPI2 SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位            {            retry++;            if(retry>200)return 0;            }                                                                  return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据        

mcp2515初始化代码:---------------------------------------------------------------------------------

        SPIByteWrite(CANCTRL0x80);                    //MCP2515复位进入配置模式        delay_ms(1);

/*--------初始化接收过滤器,接收屏蔽器-----*/
SPIByteWrite(RXM0SIDH0x00);
SPIByteWrite(RXM0SIDL0x00); //屏蔽器

 SPIByteWrite(RXF0SIDH0x00);    //过滤器 SPIByteWrite(RXF0SIDL0x00);

/*-------------*/
//设置波特率为125Kbps 共16个tq
//set CNF1SJW=00长度为1TQBRP=1TQ=[2*(BRP+1)]/Fsoc=2*2/8M=0.5us SPIByteWrite(CNF10x01);

//set CNF2SAM=0在采样点对总线进行一次采样,PHSEG1=(6+1)TQ=7TQPRSEG=(1+1)TQ=2TQ
SPIByteWrite(CNF20xB1);

//set CNF3PHSEG2=(5+1)TQ=6TQ同时当CANCTRL.CLKEN=1时设定CLKOUT引脚为时间输出使能位
SPIByteWrite(CNF30x05);

//set TXB0,设置发送缓冲器0的标识符和发送的数据,以及发送的数据长度
SPIByteWrite(TXB0SIDH0x00);//设置发送缓冲器0的标准标识符,待修改***
SPIByteWrite(TXB0SIDL0x00);//用到标准标识符

/*set TXB1
SPIByteWrite(TXB1SIDH0x50); //Set TXB0 SIDH
SPIByteWrite(TXB1SIDL0x00); //Set TXB0 SIDL
SPIByteWrite(TXB1DLC0x40 | DLC_8); //Set DLC = 3 bytes and RTR bit*/

//设置接收缓冲器0的标识符和初始化数据
SPIByteWrite(RXB0SIDH0x00);//设置接收缓冲器0的标准标识符,待修改***
SPIByteWrite(RXB0SIDL0x60);//用到标准标识符
SPIByteWrite(RXB0CTRL0x60);//仅仅接收标准标识符的有效信息,FIILHIT0=0表示RXB0 ,采用FILHIT0
SPIByteWrite(RXB0DLCDLC_8);//设置接收数据的长度为8个字节

SPIByteWrite(RXF0SIDH0x00);//初始化接收滤波器0,待修改***
SPIByteWrite(RXF0SIDL0x00);
SPIByteWrite(RXM0SIDH0xFF);//初始化接收屏蔽器0,待修改***

SPIByteWrite(CANCTRLREQOP_NORMAL|CLKOUT_ENABLED);//设置正常模式 dummy=SPIByteRead(CANSTAT);        //如果还处于配置模式,就进入工作模式配置 if(OPMODE_NORMAL!=(dummy&&0xE0))

{
SPIByteWrite(CANCTRLREQOP_NORMAL|CLKOUT_ENABLED);//判断进入正常工作模式

}
这是MCP2515发送函数:-----------------------------------------------------------------
unsigned char tempdataj;
tempdata=SPIByteRead(CAN_RD_STATUS);
SPIByteWrite(TXB0DLClength1);
for(j=0;j<length1;j++)
{
SPIByteWrite(TXB0D0+jCAN_TX_Buf[j]);
}

if(tempdata&0x04)//判断TXREQ标志位
{
delay_ms(1);
SPIByteWrite(TXB0CTRL0);//清除TXREQ标志位
while(SPIByteRead(CAN_RD_STATUS)&0x04);//等待TXREQ清零
}
CS=0;
WriteSPI(CAN_RTS_TXB0);//发送缓冲器0请求发送
CS=1;

这是主函数:---我主要是通过mcp2515发送数据给另外一块stm32:

int key=0;
delay_init();
LED_Init();
SPI2_Init();
MCP_2515_init();

while(1)

{

      CAN_Send_anylength(buf0x08);              delay_ms(1000);

}

以上就是主要代码,完全是看手册的还有厂家给的代码,就是不通,求大神帮忙看看,谢谢,

解决方案

怎么用Eclipse开发STM32

解决方案二:
已经做出来了,谢谢大家

解决方案三:
已经做出来了,谢谢大家

时间: 2024-11-03 10:15:37

stm32-STM32用MCP2515与另一块STM32通讯失败的相关文章

在linux下搭建STM32工程

转载自康神博客:http://blog.csdn.net/u013298300/article/details/50243935 在LINUX下开始一个STM32工程 在LINUX下开始一个STM32工程 一安装工具 二 如何工作 1 需要作的工作 2 工作分析 21 makefile分析 22 链接器脚本分析 3 分析结果 三开始工作 1 创建文工程目录 3 编写Makefile 32 src子目录Makefile 33 arch子目录Makefile 34 lib子目录Makefile 35

请问stm32直接操作寄存器怎么建工程啊,和库函数版本一样吗?

问题描述 请问stm32直接操作寄存器怎么建工程啊,和库函数版本一样吗? 请问stm32直接操作寄存器怎么建工程啊,和库函数版本一样吗?求大神指教,本人菜鸟一只 解决方案 stm32 BKP寄存器操作[操作寄存器+库函数]stm32 BKP寄存器操作[操作寄存器+库函数] 解决方案二: 库函数版本也是支持直接操作寄存器的.但也可以不用,工程会简单很多,只包含STM32F103X.h这样的头文件就OK了.初学者建议用库函数版本,简单容易上手

stm32开发之标准库的介绍

1 STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序.数据结构和宏组成,包括了微控制器所有外设的性能特征.该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设.因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本.每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能.每个器件的开发都由一个通用API (

iic-有用过Pcap01-AD这款芯片的吗?

问题描述 有用过Pcap01-AD这款芯片的吗? 用这款芯片测量微电容,单片机试STM32,和Pcap01之间采用模拟IIC通讯.主机发送完器件地址后,Pcap01芯片没有应答.求问可能什么问题?

意法半导体扮演RFID推手 共享庞大商机

高科技发展日新月异,不过近年来许多技术及产品的创新皆围绕着"物联网(IoT)"此一主轴,物联网相关应用的衍生充满无限大的想像空间,带动庞大的市场需求,促使业者相继地投入智慧城市.智慧居家.智慧生活.身分辨识.远端医疗等应用领域.物联网影响所及,我们的食衣住行等日常生活.工作环境及运作模式.休闲娱乐方式等皆将产生重大变革. 根据国际研究机构Gartner于2015年所发布的资讯,预估2020年连网装置将超过260亿个,后续衍生的商机更可望高达上兆美元.麦肯锡全球研究院(McKinsey

NFC顺物联网之势崛起,意法半导体实力几何?

高科技发展日新月异,不过近年来许多技术及产品的创新皆围绕着"物联网(IoT)"此一主轴,物联网相关应用的衍生充满无限大的想像空间,带动庞大的市场需求,促使业者相继地投入智慧城市.智慧居家.智慧生活.身分辨识.远端医疗等应用领域.物联网影响所及,我们的食衣住行等日常生活.工作环境及运作模式.休闲娱乐方式等皆将产生重大变革. 根据国际研究机构Gartner于2015年所发布的资讯,预估2020年连网装置将超过260亿个,后续衍生的商机更可望高达上兆美元.麦肯锡全球研究院(McKinsey

在MDK上建立一个C++的STM32开发工程

 最近,我惊讶地发现居然可以用C++进行嵌入式程序开发,甚至是裸系统程序.之前,做单片机开发.STM32上程序开发,想到的都是C语言.汇编语言,根 本就没有考虑过还可以用C++语言做开发.近日,在学习公司的项目之后,发现C++有其独道之处.开发起来比C语言更方便架构搭建与程序管理.      我之前对C++有曲解,总认为C++只适合做上层应用软件开发,不适用于单片机开发.一方面是因为C++喜欢来不不就new一个对象.对于内存空间非常紧 张的单片机,只能望海兴叹.二是C++生成的代码量较C庞大,效

wi-fi-android与单片机(STM32)通过wifi如何实现通信?

问题描述 android与单片机(STM32)通过wifi如何实现通信? 新人求解,最近在做一个APP,到时候要与stm32通信,要实现数据,图像同步到APP上 ,想问一下怎么实现,协议用什么?望大牛指导一下. 解决方案 stm32支持网络协议有点困难, 单片机加WIFI透传模块比较好.搞定串口通迅就行了. 解决方案二: 想都不用想,肯定wifi透传,两个主从wifi模块通过串口收发数据,http你就别想了. 解决方案三: 用HTTP协议进行通信 解决方案四: 单片机买了wifi模块,只要搞定串

stm32wifi通讯-stm32驱动esp8266遇到的问题,有信号,但不是程序设定的新号

问题描述 stm32驱动esp8266遇到的问题,有信号,但不是程序设定的新号 入手神舟四号开发板一块,载入程序,上电,有wifi信号,但是是原始的ESP_XXXX信号,我在程序里有关于wifi的名称密码的定义,这些都没有实现,请问是什么问题?