查看: 2142|回复: 2

[原创] [原创] LPC55S16板子CAN1发送

[复制链接]
  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 1515 天

    连续签到: 3 天

    [LV.Master]伴坛终老

    152

    主题

    3196

    帖子

    31

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    8773
    最后登录
    2025-9-6
    发表于 2020-11-16 10:46:59 | 显示全部楼层 |阅读模式
        设计的板子是外扩的CAN芯片来实现CAN通信,先来测试下CAN1的发送通信。

       一、硬件电路

        CAN1通信使用到FC3-SPI功能。
        1.1、LPC55S16的SPI3引脚
        002.png
        1.2、CAN部分电路图
        001.png


        二、程序部分
       
        2.1、SPI部分程序
        spi.c
    1. <font size="3"><font size="3">#include "fsl_common.h"
    2. #include "fsl_iocon.h"
    3. #include "pin_mux.h"
    4. #include "fsl_gpio.h"
    5. #include "fsl_debug_console.h"
    6. #include "fsl_power.h"
    7. #include "fsl_spi.h"
    8. #include "spi.h"

    9. spi_master_config_t userConfig = {0};
    10. spi_transfer_t xfer            = {0};

    11. void SPI_InitPins(void)
    12. {
    13.         /* Define the init structure for the output CS pin*/
    14.         gpio_pin_config_t gpio_config = {
    15.                         kGPIO_DigitalOutput,
    16.                         0,
    17.         };
    18.     /* Enables the clock for the I/O controller.: Enable Clock. */
    19.         CLOCK_EnableClock(kCLOCK_Iocon);

    20.         const uint32_t port0_pin2_config = (/* Pin is configured as FC3_TXD_SCL_MISO_WS */
    21.                                                                                                                                                          IOCON_PIO_FUNC1 |
    22.                                                                                                                                                          /* Selects pull-up function */
    23.                                                                                                                                                          IOCON_PIO_MODE_PULLUP |
    24.                                                                                                                                                          /* Standard mode, output slew rate control is enabled */
    25.                                                                                                                                                          IOCON_PIO_SLEW_STANDARD |
    26.                                                                                                                                                          /* Input function is not inverted */
    27.                                                                                                                                                          IOCON_PIO_INV_DI |
    28.                                                                                                                                                          /* Enables digital function */
    29.                                                                                                                                                          IOCON_PIO_DIGITAL_EN |
    30.                                                                                                                                                          /* Open drain is disabled */
    31.                                                                                                                                                          IOCON_PIO_OPENDRAIN_DI);
    32.         /* PORT0 PIN2  is configured as FC3_TXD_SCL_MISO_WS */
    33.         IOCON_PinMuxSet(IOCON, 0U, 2U, port0_pin2_config);

    34.         const uint32_t port0_pin3_config = (/* Pin is configured as FC3_RXD_SDA_MOSI_DATA */
    35.                                                                                                                                                          IOCON_PIO_FUNC1 |
    36.                                                                                                                                                          /* Selects pull-up function */
    37.                                                                                                                                                          IOCON_PIO_MODE_PULLUP |
    38.                                                                                                                                                          /* Standard mode, output slew rate control is enabled */
    39.                                                                                                                                                          IOCON_PIO_SLEW_STANDARD |
    40.                                                                                                                                                          /* Input function is not inverted */
    41.                                                                                                                                                          IOCON_PIO_INV_DI |
    42.                                                                                                                                                          /* Enables digital function */
    43.                                                                                                                                                          IOCON_PIO_DIGITAL_EN |
    44.                                                                                                                                                          /* Open drain is disabled */
    45.                                                                                                                                                          IOCON_PIO_OPENDRAIN_DI);
    46.         /* PORT0 PIN3  is configured as FC3_RXD_SDA_MOSI_DATA */
    47.         IOCON_PinMuxSet(IOCON, 0U, 3U, port0_pin3_config);

    48.         const uint32_t port0_pin6_config = (/* Pin is configured as FC3_SCK */
    49.                                                                                                                                                          IOCON_PIO_FUNC1 |
    50.                                                                                                                                                          /* Selects pull-up function */
    51.                                                                                                                                                          IOCON_PIO_MODE_PULLUP |
    52.                                                                                                                                                          /* Standard mode, output slew rate control is enabled */
    53.                                                                                                                                                          IOCON_PIO_SLEW_STANDARD |
    54.                                                                                                                                                          /* Input function is not inverted */
    55.                                                                                                                                                          IOCON_PIO_INV_DI |
    56.                                                                                                                                                          /* Enables digital function */
    57.                                                                                                                                                          IOCON_PIO_DIGITAL_EN |
    58.                                                                                                                                                          /* Open drain is disabled */
    59.                                                                                                                                                          IOCON_PIO_OPENDRAIN_DI);
    60.         /* PORT0 PIN6 is configured as FC3_SCK */
    61.         IOCON_PinMuxSet(IOCON, 0U, 6U, port0_pin6_config);

    62.         const uint32_t port0_pin4_config = (/* Pin is configured as cs */
    63.                                                                                                                                                          IOCON_PIO_FUNC0 |
    64.                                                                                                                                                          /* Selects pull-up function */
    65.                                                                                                                                                          IOCON_PIO_MODE_PULLUP |
    66.                                                                                                                                                          /* Standard mode, output slew rate control is enabled */
    67.                                                                                                                                                          IOCON_PIO_SLEW_STANDARD |
    68.                                                                                                                                                          /* Input function is not inverted */
    69.                                                                                                                                                          IOCON_PIO_INV_DI |
    70.                                                                                                                                                          /* Enables digital function */
    71.                                                                                                                                                          IOCON_PIO_DIGITAL_EN |
    72.                                                                                                                                                          /* Open drain is disabled */
    73.                                                                                                                                                          IOCON_PIO_OPENDRAIN_DI);
    74.         IOCON_PinMuxSet(IOCON, 0U, 4U, port0_pin4_config);    //CAN1_CS
    75.         GPIO_PortInit(GPIO, 0U);
    76.         GPIO_PinInit(GPIO, 0U, 4U, &gpio_config);
    77. }

    78. void InitSpi(void)
    79. {
    80.         uint32_t sourceClock = 0U;
    81.         
    82.         /* attach 12 MHz clock to SPI3 */
    83.         CLOCK_AttachClk(kFRO12M_to_FLEXCOMM3 );
    84.         
    85.         /* reset FLEXCOMM for SPI3 */
    86.   RESET_PeripheralReset(kFC3_RST_SHIFT_RSTn);
    87.         
    88.         SPI_InitPins();
    89.         
    90.         SPI_MasterGetDefaultConfig(&userConfig);
    91.         sourceClock          = EXAMPLE_SPI_MASTER_CLK_FREQ;
    92.         userConfig.sselNum = (spi_ssel_t)EXAMPLE_SPI_SSEL;
    93.         userConfig.sselPol = (spi_spol_t)EXAMPLE_SPI_SPOL;
    94.         userConfig.baudRate_Bps = 500000;
    95.         SPI_MasterInit(EXAMPLE_SPI_MASTER, &userConfig, sourceClock);
    96. }

    97. void spi3_WriteDat(uint8_t dat)
    98. {
    99.         uint8_t srcBuff[2];
    100.         uint8_t destBuff[2];
    101.         srcBuff[0]=dat;
    102.         xfer.txData      = srcBuff;
    103.         xfer.rxData      = destBuff;
    104.         xfer.dataSize    = 1;//sizeof(destBuff);
    105.         xfer.configFlags = kSPI_FrameAssert;// kSPI_FrameDelay;//kSPI_FrameAssert;
    106.         SPI_MasterTransferBlocking(EXAMPLE_SPI_MASTER, &xfer);
    107. }</font></font>
    复制代码
           spi.h
    1. <font size="3"><font size="3">#ifndef __SPI_H_
    2. #define __SPI_H_

    3. #include "stdint.h"

    4. /*******************************************************************************
    5. * Definitions
    6. ******************************************************************************/
    7. #define EXAMPLE_SPI_MASTER          SPI3
    8. #define EXAMPLE_SPI_MASTER_IRQ      FLEXCOMM3_IRQn
    9. #define EXAMPLE_SPI_MASTER_CLK_SRC  kCLOCK_Flexcomm3
    10. #define EXAMPLE_SPI_MASTER_CLK_FREQ CLOCK_GetFlexCommClkFreq(3U)
    11. #define EXAMPLE_SPI_SSEL            1
    12. #define SPI_MASTER_IRQHandler       FLEXCOMM3_IRQHandler
    13. #define EXAMPLE_SPI_SPOL            kSPI_SpolActiveAllLow

    14. void InitSpi(void);
    15. void spi3_WriteDat(uint8_t dat);
    16. #endif</font></font>
    复制代码

        2.2、CAN部分程序

        mcp2515.c
       
    1. <font size="3">#include "fsl_common.h"
    2. #include "fsl_iocon.h"
    3. #include "pin_mux.h"
    4. #include "led.h"
    5. #include "fsl_gpio.h"
    6. #include "mcp2515.h"
    7. #include "spi.h"

    8. void MCP2515_Reset(void)
    9. {
    10.         can1_cs_l();
    11.         spi3_WriteDat(CAN_RESET);
    12.         can1_cs_h();
    13. }

    14. void MCP2515_BitModity(uchar addr, uchar msk, uchar dat)
    15. {
    16.         can1_cs_l();
    17.         spi3_WriteDat(CAN_BIT_MODIFY);      
    18.         spi3_WriteDat(addr);                                                         
    19.         spi3_WriteDat(msk);                                                                 
    20.         spi3_WriteDat(dat);                                                         
    21.         can1_cs_h();
    22. }

    23. void SPI_WriteByte(uchar adr,uchar dat)
    24. {
    25.         can1_cs_l();
    26.         spi3_WriteDat(CAN_WRITE);
    27.         spi3_WriteDat(adr);
    28.         spi3_WriteDat(dat);
    29.         can1_cs_h();
    30. }

    31. void CAN_Send(uchar *CAN_TX_Buf)
    32. {
    33.         
    34.         MCP2515_BitModity(TXB0CTRL,0x08,0x00);   
    35.         SPI_WriteByte(TXB0SIDH,0x55);
    36.         SPI_WriteByte(TXB0SIDL,0x08);
    37.         SPI_WriteByte(TXB0EID8,0x55);
    38.         SPI_WriteByte(TXB0EID0,0x88);

    39.         SPI_WriteByte(TXB0DLC,DLC_8);         
    40.         SPI_WriteByte(TXB0D0,CAN_TX_Buf[0]);         
    41.         SPI_WriteByte(TXB0D1,CAN_TX_Buf[1]);
    42.         SPI_WriteByte(TXB0D2,CAN_TX_Buf[2]);
    43.         SPI_WriteByte(TXB0D3,CAN_TX_Buf[3]);
    44.         SPI_WriteByte(TXB0D4,CAN_TX_Buf[4]);
    45.         SPI_WriteByte(TXB0D5,CAN_TX_Buf[5]);
    46.         SPI_WriteByte(TXB0D6,CAN_TX_Buf[6]);
    47.         SPI_WriteByte(TXB0D7,CAN_TX_Buf[7]);
    48.         
    49.         can1_cs_l();
    50.         spi3_WriteDat(CAN_RTS | 0x01);               
    51.         can1_cs_h();
    52. }

    53. void Init_mcp2515(void)
    54. {

    55.         MCP2515_Reset();
    56.         
    57.         MCP2515_BitModity(CANCTRL,0xE0,0x80);
    58.         SPI_WriteByte(CNF1,0x04);         //100k
    59.         SPI_WriteByte(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);                  
    60.         SPI_WriteByte(CNF3,PHSEG2_3TQ);                                                                                 
    61.          SPI_WriteByte(CANINTF,0x00);                                                                        
    62.          SPI_WriteByte(CANINTE,0x03);        
    63.         
    64.         SPI_WriteByte(RXB0CTRL,0x60);        

    65.         SPI_WriteByte(RXM0SIDH,0xff);
    66.         SPI_WriteByte(RXM0SIDL,0xff);
    67.         SPI_WriteByte(RXM0EID8,0xff);
    68.         SPI_WriteByte(RXM0EID0,0xff);

    69.         SPI_WriteByte( BFPCTRL, 0 );                                                         
    70.         SPI_WriteByte( TXRTSCTRL, 0 );        
    71.                                        
    72.         MCP2515_BitModity(CANCTRL,0xE0,0x00);
    73. }

    74. uchar SPI0_ReadByte(uchar adr)
    75. {
    76.         uchar rxdat;

    77.         can1_cs_l();
    78.         spi3_WriteDat(CAN_READ);         
    79.         spi3_WriteDat(adr);               
    80.         //rxdat=SPI0_READ();
    81.         can1_cs_h();
    82.         return rxdat;
    83. }

    84. </font>
    复制代码

        2.3、主程序
        main.c
       
    1. <font size="3">int main(void)
    2. {
    3.         uint8_t x=0;

    4.         POWER_SetBodVbatLevel(kPOWER_BodVbatLevel1650mv, kPOWER_BodHystLevel50mv, false);  /* set BOD VBAT level to 1.65V */
    5.         BOARD_BootClockPLL150M();
    6.         InitUart();
    7.         InitLed();

    8.         LCD_Pins_Config();

    9.         if (SysTick_Config(SystemCoreClock / 1000U))
    10.         {
    11.                 while (1)
    12.                 {
    13.                 }
    14.         }
    15.         LED0_OFF();
    16.         LED1_ON();

    17.         InitSpi();
    18.         Init_mcp2515();
    19.         POINT_COLOR=RED;
    20.         while (1)
    21.         {

    22.                 x++;
    23.                 if(x==12)
    24.                 {
    25.                         x=0;
    26.                 }
    27.                 SysTick_DelayTicks(100U);
    28.                 can_rx_buf[0]=0Xff;
    29.                 can_rx_buf[1]=0xaa;
    30.                 can_rx_buf[2]=x;
    31.                 CAN_Send(can_rx_buf);
    32.                
    33.         }
    34. }</font>
    复制代码
       
        三、运行结果  

        使用CAN卡接收到板子数据
        003.png


    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-8-8 16:43
  • 签到天数: 1504 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4693

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10101
    最后登录
    2025-9-4
    发表于 2020-11-16 11:20:31 | 显示全部楼层
    楼主 厉害啊!
    羡慕有CAN卡的人啊
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-12-2 08:40
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    103

    主题

    869

    帖子

    7

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4353
    最后登录
    2025-8-21
    发表于 2020-11-16 14:27:25 | 显示全部楼层
    厉害了
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-6 11:43 , Processed in 0.085817 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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