查看: 1890|回复: 5

[分享] KL26Z-SPI通信

[复制链接]

该用户从未签到

5

主题

52

帖子

0

注册会员

Rank: 2

积分
195
最后登录
2016-2-29
发表于 2015-7-21 16:06:11 | 显示全部楼层 |阅读模式
本帖最后由 spromise 于 2015-7-21 16:28 编辑

因为正在做KL26Z的SPI通信,现在需要通过DMA实现SPI的读写,求助一个可以用的DMA实现SPI的通信的例程,最好是作为SPI从机实现的,希望各路大侠相助,万分感谢!!!!!

评分

参与人数 1NXP金币 +5 收起 理由
小七 + 5 打赏!

查看全部评分

回复

使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16714
    最后登录
    1970-1-1
    发表于 2015-7-21 20:49:58 | 显示全部楼层
    官方库中有啊
    回复 支持 1 反对 0

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2015-7-22 08:08:55 | 显示全部楼层
    1. 例程代码分享,你可以参考一下
    复制代码
    1. void spi0_dma_master_spi1_slave(void)
    2. {
    3.   unsigned char k=0;
    4.   unsigned char dummy = 0;
    5.   unsigned char sendData = 0;
    6.   unsigned char readData = 0;
    7.   
    8.          SIM_SCGC6 |= SIM_SCGC6_DMACHMUX_MASK; //DMAMUX Clock Gate Control: 1, clock enable---
    9.          SIM_SCGC7 |= SIM_SCGC7_DMA_MASK;   //DMA Clock Gate control: 1, clock enable----
    10.          

    11.                 m_tdata8[0] = 0xF0;   
    12.                 m_tdata8[1] = 0x11;
    13.                 m_tdata8[2] = 0x22;
    14.                 m_tdata8[3] = 0x33;
    15.                 m_tdata8[4] = 0x44;
    16.                 m_tdata8[5] = 0x66;
    17.                 m_tdata8[6] = 0x77;
    18.                 m_tdata8[7] = 0x88;
    19.                 for (k=0; k<8; k++)
    20.                         m_rdata8[k] = 0;
    21.                
    22.                 s_tdata8[0] = 0x01;   
    23.                 s_tdata8[1] = 0x23;
    24.                 s_tdata8[2] = 0x45;
    25.                 s_tdata8[3] = 0x67;
    26.                 s_tdata8[4] = 0x89;
    27.                 s_tdata8[5] = 0xAB;
    28.                 s_tdata8[6] = 0xCD;
    29.                 s_tdata8[7] = 0xEF;
    30.                 for (k=0; k<8; k++)
    31.                         s_rdata8[k] = 0;
    32.                 dma_int_cnt = 0;                        //this variable is used to indicates the count of transmission interrupt
    33.                 extend_cnt = 0;

    34.                  enable_irq(0);    //DMA channel 0 transfer complete and error interrupt
    35.                  enable_irq(1);    //DMA channel 1 transfer complete and error        interrupt
    36.                  enable_irq(2);    //DMA channel 2 transfer complete and error        interrupt
    37.                  enable_irq(3);    //DMA channel 3 transfer complete and error        interrupt
    38.        
    39.     /*                    SIM_CLKDIV1 = ( 0
    40.                         | SIM_CLKDIV_OUTDIV(0x1)
    41.                         | SIM_CLKDIV_OUTDIV(0) );  // what usage?*/
    42.               //  
    43.          //SPI0 receive dma source number is 16; SPI0 transmint dma source number is 17
    44.          //*****channel 0--->TX, channel 1----->RX************
    45.          DMAMUX0_CHCFG(0) |= DMAMUX_CHCFG_ENBL_MASK & (~DMAMUX_CHCFG_TRIG_MASK);
    46.          DMAMUX0_CHCFG(0) |= DMAMUX_CHCFG_SOURCE(17); //TX---DMA channel 0-SPI0 source number--ENBL=1--TRIG=0---
    47.          
    48.          DMAMUX0_CHCFG(1) |= DMAMUX_CHCFG_ENBL_MASK & (~DMAMUX_CHCFG_TRIG_MASK);
    49.          DMAMUX0_CHCFG(1) |= DMAMUX_CHCFG_SOURCE(16); //RX---DMA channel 1-SPI0 source number--ENBL=1--TRIG=0---
    50.          
    51.          //*****channel 2--->TX, channel 3----->RX************
    52.          DMAMUX0_CHCFG(2) |= DMAMUX_CHCFG_ENBL_MASK & (~DMAMUX_CHCFG_TRIG_MASK);
    53.          DMAMUX0_CHCFG(2) |= DMAMUX_CHCFG_SOURCE(19); //TX---DMA channel 2-SPI1 source number--ENBL=1--TRIG=0---
    54.          
    55.          DMAMUX0_CHCFG(3) |= DMAMUX_CHCFG_ENBL_MASK & (~DMAMUX_CHCFG_TRIG_MASK);
    56.          DMAMUX0_CHCFG(3) |= DMAMUX_CHCFG_SOURCE(18); //RX---DMA channel 3-SPI1 source number--ENBL=1--TRIG=0---
    57.          //************channel request number ???????*****************
    58.          

    59.          DMA_SAR0 = (uint32_t)(&(m_tdata8));
    60.          DMA_DAR0 = (uint32_t)(&(SPI0_DL));
    61. //         DMA_SAR0 = (uint32_t)(&(SPI0_D));
    62.         // DMA_DAR0 = (uint32_t)(&(m_rdata8));
    63.          DMA_DSR_BCR0 |= DMA_DSR_BCR_BCR(8);    //BCR contains the number of bytes yet to be transferred for a given block
    64.          DMA_DCR0 = DMA_DCR_ERQ_MASK|DMA_DCR_EINT_MASK|DMA_DCR_D_REQ_MASK|DMA_DCR_CS_MASK      
    65.                             |DMA_DCR_DSIZE(1)|DMA_DCR_SSIZE(1)|DMA_DCR_SINC_MASK;                          //|DMA_DCR_CS_MASK

    66.          DMA_SAR1 = (uint32_t)(&(SPI0_DL));
    67.          DMA_DAR1 = (uint32_t)(&(m_rdata8));
    68.    //      DMA_SAR1 = (uint32_t)(&(m_tdata8));
    69.         // DMA_DAR1 = (uint32_t)(&(SPI0_D));
    70.          DMA_DSR_BCR1 |= DMA_DSR_BCR_BCR(8);                        //BCR contains the number of bytes yet to be transferred for a given block
    71.          DMA_DCR1 = DMA_DCR_ERQ_MASK|DMA_DCR_EINT_MASK|DMA_DCR_D_REQ_MASK|DMA_DCR_CS_MASK      
    72.                             |DMA_DCR_DSIZE(1)|DMA_DCR_SSIZE(1)|DMA_DCR_DINC_MASK;                          //|DMA_DCR_CS_MASK
    73.          
    74.          DMA_SAR2 = (uint32_t)(&(s_tdata8));                           //----tx-----
    75.          DMA_DAR2 = (uint32_t)(&(SPI1_DL));
    76.    //    DMA_SAR2 = (uint32_t)(&(SPI1_D));                          //----rx-----
    77.         // DMA_DAR2 = (uint32_t)(&(s_rdata8));
    78.          DMA_DSR_BCR2 |= DMA_DSR_BCR_BCR(8);    //BCR contains the number of bytes yet to be transferred for a given block
    79.          DMA_DCR2 = DMA_DCR_ERQ_MASK|DMA_DCR_EINT_MASK|DMA_DCR_D_REQ_MASK|DMA_DCR_CS_MASK      
    80.                             |DMA_DCR_DSIZE(1)|DMA_DCR_SSIZE(1)|DMA_DCR_SINC_MASK;                          //|DMA_DCR_CS_MASK

    81.          DMA_SAR3 = (uint32_t)(&(SPI1_DL));                          //----rx-----
    82.          DMA_DAR3 = (uint32_t)(&(s_rdata8));
    83.    //      DMA_SAR3 = (uint32_t)(&(s_tdata8));                           //----tx-----
    84.         // DMA_DAR3 = (uint32_t)(&(SPI1_D));
    85.          DMA_DSR_BCR3 |= DMA_DSR_BCR_BCR(8);                        //BCR contains the number of bytes yet to be transferred for a given block
    86.          DMA_DCR3 = DMA_DCR_ERQ_MASK|DMA_DCR_EINT_MASK|DMA_DCR_D_REQ_MASK|DMA_DCR_CS_MASK      
    87.                             |DMA_DCR_DSIZE(1)|DMA_DCR_SSIZE(1)|DMA_DCR_DINC_MASK;                          //|DMA_DCR_CS_MASK
    88.          
    89.          
    90.                 SPI0_C1 |= SPI_C1_SSOE_MASK;      //|SPI0_C1_CPOL_MASK|SPI0_C1_LSBFE_MASK;
    91.                 SPI0_C2 |= SPI_C2_MODFEN_MASK;

    92.                 SPI0_C1 |= SPI_C1_CPHA_MASK;
    93.                 //SPI0_C1 &= (~SPI_C1_CPHA_MASK);               
    94.                 SPI0_C1 |= SPI_C1_CPOL_MASK;
    95.                 //SPI0_C1 &= (~SPI_C1_CPOL_MASK);               
    96.                 //SPI0_C1 |= SPI0_C1_LSBFE_MASK;
    97.                 SPI0_C1 &= (~SPI_C1_LSBFE_MASK);

    98.                 //SPI0_C1 &= (~SPI0_C1_SPIE_MASK);     //Disable RX interrrupt
    99.                   //SPI0_C1 |= SPI0_C1_SPIE_MASK;             //enable RX interrrupt                   
    100.                 //SPI0_C1 &= (~SPI0_C1_SPTIE_MASK);         //Disable the transmit interrupt
    101.                 //SPI0_C1 |= SPI0_C1_SPTIE_MASK;         //Enable the transime interrupt
    102.                
    103.                 SPI1_C1 |= SPI_C1_MSTR_MASK;
    104.                 SPI1_BR = 0x02;
    105.                 //SPI1_C1 &= (~SPI1_C1_MSTR_MASK);          //---slave----bus clock is 12.5Mhz--0.08us--               
    106.                 //SPI0_BR = 0x43;  //SPPR = 4, SPR = 3, bps div = (SPPR+1)*2^(SPR+1) = 80,----Tspi--6.4us
    107.                 //SPI0_BR = 0x40; //bps div = 10,---------0.8us
    108.                 //SPI0_BR = 0x30; //bps div = 8,----------0.64us
    109.                 //SPI0_BR = 0x10; //bps div = 4,----------0.32us
    110.                 //SPI0_BR = 0x00; //bps div = 2,----------0.16us----6.125Mhz
    111.                 //SPI0_BR = 0x54; //bps div = 192,----------15.36us
    112.                 //SPI0_BR = 0x77; //bps div = 2048,----------163.84us        
    113.                // SPI1_BR = 0x01;
    114.                 SPI1_C1 |= SPI_C1_SSOE_MASK;      
    115.                 SPI1_C2 |= SPI_C2_MODFEN_MASK;

    116.                 SPI1_C1 |= SPI_C1_CPHA_MASK;
    117.                 //SPI1_C1 &= (~SPI_C1_CPHA_MASK);               
    118.                 SPI1_C1 |= SPI_C1_CPOL_MASK;
    119.                 //SPI1_C1 &= (~SPI_C1_CPOL_MASK);               
    120.                 //SPI1_C1 |= SPI1_C1_LSBFE_MASK;
    121.                 SPI1_C1 &= (~SPI_C1_LSBFE_MASK);

    122.                
    123.                
    124.                 SPI1_C2 |= SPI_C2_RXDMAE_MASK;
    125.                 SPI0_C2 |= SPI_C2_TXDMAE_MASK;
    126.                 SPI0_C2 |= SPI_C2_RXDMAE_MASK;
    127.                 SPI1_C2 |= SPI_C2_TXDMAE_MASK;
    128.                
    129.                 SPI0_C1 |= SPI_C1_SPE_MASK;
    130.                 SPI1_C1 |= SPI_C1_SPE_MASK;
    131.              //   SPI0_C1 |= SPI0_C1_SPE_MASK;
    132.                
    133.                
    134.                
    135.                

    136.                
    137.     for(k=0; k<8 ; k++)
    138.     {
    139.         if(s_rdata8[k] != (uint8)m_tdata8[k])
    140.         {  
    141.             printf("k = 0x%01x\r\n",k);
    142.             printf("m_tdata8 = 0x%02x\r\n",(unsigned char)(m_tdata8[k] & 0xff));
    143.             printf("s_rdata8 = 0x%02x\r\n",s_rdata8[k]);
    144.      //       error_count++;
    145.             printf("Transmit unsuccessful\n");
    146.         }
    147.         else
    148.         {
    149.             printf("m_tdata8 = 0x%02x\r\n",m_tdata8[k]);
    150.             printf("s_rdata8 = 0x%02x\r\n",s_rdata8[k]);
    151.             printf("Transmit successful\n");
    152.         }
    153.          
    154.         if(m_rdata8[k] != (uint8)s_tdata8[k])
    155.         {
    156.             printf("k = 0x%08x\r\n",k);
    157.             printf("s_tdata8 = 0x%04x\r\n",s_tdata8[k]);
    158.             printf("m_rdata8 = 0x%04x\r\n",m_rdata8[k]);
    159. //    //        error_count++;
    160.             printf("Transmit unsuccessful\n");
    161.         }
    162.         else
    163.         {
    164.             printf("s_tdata8 = 0x%04x\r\n",s_tdata8[k]);
    165.             printf("m_rdata8 = 0x%04x\r\n",m_rdata8[k]);
    166.              printf("Transmit successful\n");
    167.         }
    168.    
    169.     }
    170.                 while(1);



    171. }
    复制代码

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5

    主题

    52

    帖子

    0

    注册会员

    Rank: 2

    积分
    195
    最后登录
    2016-2-29
     楼主| 发表于 2015-7-22 09:37:40 | 显示全部楼层

    我有问我这边的代理 他们说这个型号的例程没有哦
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5

    主题

    52

    帖子

    0

    注册会员

    Rank: 2

    积分
    195
    最后登录
    2016-2-29
     楼主| 发表于 2015-7-22 09:38:27 | 显示全部楼层

    谢谢大侠 我去实验一下代码
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16714
    最后登录
    1970-1-1
    发表于 2015-7-22 12:06:09 | 显示全部楼层
    spromise 发表于 2015-7-22 09:37
    我有问我这边的代理 他们说这个型号的例程没有哦

    都差不多吧
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-28 02:13 , Processed in 0.099181 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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