在线时间899 小时
UID3067179
注册时间2014-10-23
NXP金币2846
TA的每日心情 | 开心 3 小时前 |
---|
签到天数: 1515 天 连续签到: 3 天 [LV.Master]伴坛终老
版主
  
- 积分
- 8773
- 最后登录
- 2025-9-6
|
设计的板子是外扩的CAN芯片来实现CAN通信,先来测试下CAN1的发送通信。
一、硬件电路
CAN1通信使用到FC3-SPI功能。
1.1、LPC55S16的SPI3引脚
1.2、CAN部分电路图
二、程序部分
2.1、SPI部分程序
spi.c
- <font size="3"><font size="3">#include "fsl_common.h"
- #include "fsl_iocon.h"
- #include "pin_mux.h"
- #include "fsl_gpio.h"
- #include "fsl_debug_console.h"
- #include "fsl_power.h"
- #include "fsl_spi.h"
- #include "spi.h"
- spi_master_config_t userConfig = {0};
- spi_transfer_t xfer = {0};
- void SPI_InitPins(void)
- {
- /* Define the init structure for the output CS pin*/
- gpio_pin_config_t gpio_config = {
- kGPIO_DigitalOutput,
- 0,
- };
- /* Enables the clock for the I/O controller.: Enable Clock. */
- CLOCK_EnableClock(kCLOCK_Iocon);
- const uint32_t port0_pin2_config = (/* Pin is configured as FC3_TXD_SCL_MISO_WS */
- IOCON_PIO_FUNC1 |
- /* Selects pull-up function */
- IOCON_PIO_MODE_PULLUP |
- /* Standard mode, output slew rate control is enabled */
- IOCON_PIO_SLEW_STANDARD |
- /* Input function is not inverted */
- IOCON_PIO_INV_DI |
- /* Enables digital function */
- IOCON_PIO_DIGITAL_EN |
- /* Open drain is disabled */
- IOCON_PIO_OPENDRAIN_DI);
- /* PORT0 PIN2 is configured as FC3_TXD_SCL_MISO_WS */
- IOCON_PinMuxSet(IOCON, 0U, 2U, port0_pin2_config);
- const uint32_t port0_pin3_config = (/* Pin is configured as FC3_RXD_SDA_MOSI_DATA */
- IOCON_PIO_FUNC1 |
- /* Selects pull-up function */
- IOCON_PIO_MODE_PULLUP |
- /* Standard mode, output slew rate control is enabled */
- IOCON_PIO_SLEW_STANDARD |
- /* Input function is not inverted */
- IOCON_PIO_INV_DI |
- /* Enables digital function */
- IOCON_PIO_DIGITAL_EN |
- /* Open drain is disabled */
- IOCON_PIO_OPENDRAIN_DI);
- /* PORT0 PIN3 is configured as FC3_RXD_SDA_MOSI_DATA */
- IOCON_PinMuxSet(IOCON, 0U, 3U, port0_pin3_config);
- const uint32_t port0_pin6_config = (/* Pin is configured as FC3_SCK */
- IOCON_PIO_FUNC1 |
- /* Selects pull-up function */
- IOCON_PIO_MODE_PULLUP |
- /* Standard mode, output slew rate control is enabled */
- IOCON_PIO_SLEW_STANDARD |
- /* Input function is not inverted */
- IOCON_PIO_INV_DI |
- /* Enables digital function */
- IOCON_PIO_DIGITAL_EN |
- /* Open drain is disabled */
- IOCON_PIO_OPENDRAIN_DI);
- /* PORT0 PIN6 is configured as FC3_SCK */
- IOCON_PinMuxSet(IOCON, 0U, 6U, port0_pin6_config);
- const uint32_t port0_pin4_config = (/* Pin is configured as cs */
- IOCON_PIO_FUNC0 |
- /* Selects pull-up function */
- IOCON_PIO_MODE_PULLUP |
- /* Standard mode, output slew rate control is enabled */
- IOCON_PIO_SLEW_STANDARD |
- /* Input function is not inverted */
- IOCON_PIO_INV_DI |
- /* Enables digital function */
- IOCON_PIO_DIGITAL_EN |
- /* Open drain is disabled */
- IOCON_PIO_OPENDRAIN_DI);
- IOCON_PinMuxSet(IOCON, 0U, 4U, port0_pin4_config); //CAN1_CS
- GPIO_PortInit(GPIO, 0U);
- GPIO_PinInit(GPIO, 0U, 4U, &gpio_config);
- }
- void InitSpi(void)
- {
- uint32_t sourceClock = 0U;
-
- /* attach 12 MHz clock to SPI3 */
- CLOCK_AttachClk(kFRO12M_to_FLEXCOMM3 );
-
- /* reset FLEXCOMM for SPI3 */
- RESET_PeripheralReset(kFC3_RST_SHIFT_RSTn);
-
- SPI_InitPins();
-
- SPI_MasterGetDefaultConfig(&userConfig);
- sourceClock = EXAMPLE_SPI_MASTER_CLK_FREQ;
- userConfig.sselNum = (spi_ssel_t)EXAMPLE_SPI_SSEL;
- userConfig.sselPol = (spi_spol_t)EXAMPLE_SPI_SPOL;
- userConfig.baudRate_Bps = 500000;
- SPI_MasterInit(EXAMPLE_SPI_MASTER, &userConfig, sourceClock);
- }
- void spi3_WriteDat(uint8_t dat)
- {
- uint8_t srcBuff[2];
- uint8_t destBuff[2];
- srcBuff[0]=dat;
- xfer.txData = srcBuff;
- xfer.rxData = destBuff;
- xfer.dataSize = 1;//sizeof(destBuff);
- xfer.configFlags = kSPI_FrameAssert;// kSPI_FrameDelay;//kSPI_FrameAssert;
- SPI_MasterTransferBlocking(EXAMPLE_SPI_MASTER, &xfer);
- }</font></font>
复制代码 spi.h
- <font size="3"><font size="3">#ifndef __SPI_H_
- #define __SPI_H_
- #include "stdint.h"
- /*******************************************************************************
- * Definitions
- ******************************************************************************/
- #define EXAMPLE_SPI_MASTER SPI3
- #define EXAMPLE_SPI_MASTER_IRQ FLEXCOMM3_IRQn
- #define EXAMPLE_SPI_MASTER_CLK_SRC kCLOCK_Flexcomm3
- #define EXAMPLE_SPI_MASTER_CLK_FREQ CLOCK_GetFlexCommClkFreq(3U)
- #define EXAMPLE_SPI_SSEL 1
- #define SPI_MASTER_IRQHandler FLEXCOMM3_IRQHandler
- #define EXAMPLE_SPI_SPOL kSPI_SpolActiveAllLow
- void InitSpi(void);
- void spi3_WriteDat(uint8_t dat);
- #endif</font></font>
复制代码
2.2、CAN部分程序
mcp2515.c
- <font size="3">#include "fsl_common.h"
- #include "fsl_iocon.h"
- #include "pin_mux.h"
- #include "led.h"
- #include "fsl_gpio.h"
- #include "mcp2515.h"
- #include "spi.h"
- void MCP2515_Reset(void)
- {
- can1_cs_l();
- spi3_WriteDat(CAN_RESET);
- can1_cs_h();
- }
- void MCP2515_BitModity(uchar addr, uchar msk, uchar dat)
- {
- can1_cs_l();
- spi3_WriteDat(CAN_BIT_MODIFY);
- spi3_WriteDat(addr);
- spi3_WriteDat(msk);
- spi3_WriteDat(dat);
- can1_cs_h();
- }
- void SPI_WriteByte(uchar adr,uchar dat)
- {
- can1_cs_l();
- spi3_WriteDat(CAN_WRITE);
- spi3_WriteDat(adr);
- spi3_WriteDat(dat);
- can1_cs_h();
- }
- void CAN_Send(uchar *CAN_TX_Buf)
- {
-
- MCP2515_BitModity(TXB0CTRL,0x08,0x00);
- SPI_WriteByte(TXB0SIDH,0x55);
- SPI_WriteByte(TXB0SIDL,0x08);
- SPI_WriteByte(TXB0EID8,0x55);
- SPI_WriteByte(TXB0EID0,0x88);
- SPI_WriteByte(TXB0DLC,DLC_8);
- SPI_WriteByte(TXB0D0,CAN_TX_Buf[0]);
- SPI_WriteByte(TXB0D1,CAN_TX_Buf[1]);
- SPI_WriteByte(TXB0D2,CAN_TX_Buf[2]);
- SPI_WriteByte(TXB0D3,CAN_TX_Buf[3]);
- SPI_WriteByte(TXB0D4,CAN_TX_Buf[4]);
- SPI_WriteByte(TXB0D5,CAN_TX_Buf[5]);
- SPI_WriteByte(TXB0D6,CAN_TX_Buf[6]);
- SPI_WriteByte(TXB0D7,CAN_TX_Buf[7]);
-
- can1_cs_l();
- spi3_WriteDat(CAN_RTS | 0x01);
- can1_cs_h();
- }
- void Init_mcp2515(void)
- {
- MCP2515_Reset();
-
- MCP2515_BitModity(CANCTRL,0xE0,0x80);
- SPI_WriteByte(CNF1,0x04); //100k
- SPI_WriteByte(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);
- SPI_WriteByte(CNF3,PHSEG2_3TQ);
- SPI_WriteByte(CANINTF,0x00);
- SPI_WriteByte(CANINTE,0x03);
-
- SPI_WriteByte(RXB0CTRL,0x60);
- SPI_WriteByte(RXM0SIDH,0xff);
- SPI_WriteByte(RXM0SIDL,0xff);
- SPI_WriteByte(RXM0EID8,0xff);
- SPI_WriteByte(RXM0EID0,0xff);
- SPI_WriteByte( BFPCTRL, 0 );
- SPI_WriteByte( TXRTSCTRL, 0 );
-
- MCP2515_BitModity(CANCTRL,0xE0,0x00);
- }
- uchar SPI0_ReadByte(uchar adr)
- {
- uchar rxdat;
- can1_cs_l();
- spi3_WriteDat(CAN_READ);
- spi3_WriteDat(adr);
- //rxdat=SPI0_READ();
- can1_cs_h();
- return rxdat;
- }
- </font>
复制代码
2.3、主程序
main.c
- <font size="3">int main(void)
- {
- uint8_t x=0;
- POWER_SetBodVbatLevel(kPOWER_BodVbatLevel1650mv, kPOWER_BodHystLevel50mv, false); /* set BOD VBAT level to 1.65V */
- BOARD_BootClockPLL150M();
- InitUart();
- InitLed();
- LCD_Pins_Config();
- if (SysTick_Config(SystemCoreClock / 1000U))
- {
- while (1)
- {
- }
- }
- LED0_OFF();
- LED1_ON();
- InitSpi();
- Init_mcp2515();
- POINT_COLOR=RED;
- while (1)
- {
- x++;
- if(x==12)
- {
- x=0;
- }
- SysTick_DelayTicks(100U);
- can_rx_buf[0]=0Xff;
- can_rx_buf[1]=0xaa;
- can_rx_buf[2]=x;
- CAN_Send(can_rx_buf);
-
- }
- }</font>
复制代码
三、运行结果
使用CAN卡接收到板子数据
|
|