发 帖  
原厂入驻New
【MAX32660试用体验】我的一次不成功的spi程序
252 SPI
分享
本帖最后由 lustao 于 2019-4-18 09:54 编辑

上周试验了下spi,使用Maxim 的Eclipse加载了Maxim的Examples
spi SPI_Slave
  1. /**
  2. * [url=home.php?mod=space&uid=1455510]@file[/url]    main.c
  3. * [url=home.php?mod=space&uid=2666770]@Brief[/url]   SPI Master Demo
  4. * [url=home.php?mod=space&uid=2215779]@Details[/url] Shows Master loopback demo for SPI0 (AKA: SPI17Y) and SPI1 (AKA: SPIMSS)
  5. *          Read the printf() for instructions
  6. */

  7. /*******************************************************************************
  8. * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
  9. *
  10. * Permission is hereby granted, free of charge, to any person obtaining a
  11. * copy of this software and associated documentation files (the "Software"),
  12. * to deal in the Software without restriction, including without limitation
  13. * the rights to use, copy, modIFy, merge, publish, distribute, sublicense,
  14. * and/or sell copies of the Software, and to permit persons to whom the
  15. * Software is furnished to do so, subject to the following conditions:
  16. *
  17. * The above copyright notice and this permission notice shall be included
  18. * in all copies or substantial portions of the Software.
  19. *
  20. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21. * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  23. * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
  24. * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  25. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  26. * OTHER DEALINGS IN THE SOFTWARE.
  27. *
  28. * Except as contained in this notice, the name of Maxim Integrated
  29. * Products, Inc. shall not be used except as stated in the Maxim Integrated
  30. * Products, Inc. Branding Policy.
  31. *
  32. * The mere transfer of this software does not imply any licenses
  33. * of trade secrets, proprietary technology, copyrights, patents,
  34. * trademarks, maskwork rights, or any other form of intellectual
  35. * property whatsoever. Maxim Integrated Products, Inc. retains all
  36. * ownership rights.
  37. *
  38. * $Date: 2018-08-08 11:43:44 -0500 (Wed, 08 Aug 2018) $
  39. * $Revision: 36747 $
  40. *
  41. ******************************************************************************/

  42. /***** Includes *****/
  43. #include <stdio.h>
  44. #include <stdint.h>
  45. #include <string.h>
  46. #include "pb.h"
  47. #include "mxc_config.h"
  48. #include "LED.h"
  49. #include "mxc_pins.h"
  50. #include "mxc_delay.h"
  51. #include "uart.h"
  52. #include "spi.h"

  53. /***** Definitions *****/
  54. #define TEST_LEN           60
  55. #define TEST_LEN_BYTE      120
  56. #define clock_RATE         1000000  // Bit Rate

  57. #define TEST_MASTER SPI1A
  58. #define TEST_MASTER_IRQ SPI1_IRQn

  59. #define TEST_SLAVE SPI0A
  60. #define TEST_SLAVE_IRQ SPI0_IRQn

  61. /***** Globals *****/
  62. uint16_t master_rx_data[TEST_LEN];
  63. uint16_t master_tx_data[TEST_LEN];
  64. uint16_t slave_rx_data[TEST_LEN];
  65. uint16_t slave_tx_data[TEST_LEN];
  66. volatile int spi_slave_flag;
  67. volatile int spi_master_flag;
  68.     gpio_cfg_t toggle = {PORT_0, PIN_9, GPIO_FUNC_OUT, GPIO_PAD_NONE};

  69. /***** Functions *****/

  70. void spi_master_cb(void *req, int error)
  71. {
  72.     spi_master_flag = error;
  73. }
  74. void spi_slave_cb(void *req, int error)
  75. {
  76.     spi_slave_flag = error;
  77. }
  78. void SPI0_IRQHandler(void)
  79. {
  80.     SPI_Handler(SPI0A);
  81. }

  82. void SPI1_IRQHandler(void)
  83. {
  84.     SPI_Handler(SPI1A);

  85. }

  86. int main(void)
  87. {

  88.     int j;
  89.     spi_req_t master_req; // Initialize SPI Request struct for Master
  90.     spi_req_t slave_req;  // Initialize SPI Request struct for Slave


  91.     NVIC_EnableIRQ(TEST_MASTER_IRQ);
  92.     NVIC_EnableIRQ(TEST_SLAVE_IRQ);

  93.     printf("\n************** SPI Master and Slave Demo ****************\n");
  94.     printf("This example configures the SPI to send data between the SPI0 and SPI1. Connect SCK (P0.6) to SCK (P0.12)\n");
  95.     printf("MOSI (P0.5) to MOSI (P0.11), MISO (P0.4) to MISO (P0.10) and SSEL (P0.7) to SSEL(P0.13)  Connect these two pins together.\n");
  96.     printf("This demo shows SPI sending different bit sizes each run through. \n");

  97.     // delay before UART shutdown
  98.     while (UART_Busy(MXC_UART_GET_UART(CONSOLE_UART)));
  99.     Console_Shutdown();

  100.     // Initialize the tx_data
  101.     for(j = 0; j < TEST_LEN; j++) {
  102.         master_tx_data[j] = j;
  103.         slave_tx_data[j] = TEST_LEN-j;
  104.     }

  105.     // Configure the peripheral
  106.     if(SPI_Init(TEST_MASTER , 0, CLOCK_RATE) != E_NO_ERROR) {
  107.         Console_Init();
  108.         printf("Error configuring SPI\n");
  109.         while(1) {}
  110.     }

  111.     if(SPI_Init(TEST_SLAVE , 0, CLOCK_RATE ) != E_NO_ERROR) {
  112.         Console_Init();
  113.         printf("Error configuring SPI\n");
  114.         while(1) {}
  115.     }

  116.     // Initialize RX buffer to store data
  117.     memset(master_rx_data, 0x0, TEST_LEN_BYTE);
  118.     memset(slave_rx_data,  0x0, TEST_LEN_BYTE);
  119.     GPIO_Config(&toggle);

  120.     // Initialize spi_reqest struct for Master
  121.     master_req.ssel = 0;
  122.     master_req.ssel_pol = SPI_POL_LOW;
  123.     master_req.deass = 1;
  124.     master_req.tx_data = master_tx_data;
  125.     master_req.rx_data = master_rx_data;
  126.     master_req.len = TEST_LEN;
  127.     master_req.width = SPI0_WIDTH_1;
  128.     master_req.bits = 11;
  129.     master_req.rx_num = 0;
  130.     master_req.tx_num = 0;
  131.     master_req.callback = spi_master_cb;

  132.     // Initialize spi_request struct for slave
  133.     slave_req.ssel = 0;
  134.     slave_req.ssel_pol = SPI_POL_LOW;
  135.     slave_req.tx_data = slave_tx_data;
  136.     slave_req.rx_data = slave_rx_data;
  137.     slave_req.len = TEST_LEN;
  138.     slave_req.width = SPI0_WIDTH_1;
  139.     slave_req.bits = 11;
  140.     slave_req.tx_num = 0;
  141.     slave_req.rx_num = 0;
  142.     slave_req.callback = spi_slave_cb;

  143.     spi_master_flag =1;
  144.     spi_slave_flag =1;

  145.     // Initiate the Slave Async first before Master Sync to make sure
  146.     // data can be received and no data lost when master initiates communication


  147.     SPI_SlaveTransAsync(TEST_SLAVE, &slave_req);
  148.     SPI_MasterTrans(TEST_MASTER, &master_req);

  149.     while(spi_slave_flag == 1) {
  150.     }

  151.     Console_Init();
  152.     // Print the data
  153.     for(j = 0; j < TEST_LEN; j++) {
  154.         printf("master data %x  | slave data %x \n", master_tx_data[j], slave_rx_data[j]);
  155.     }

  156.     // Check the data sent from Master to Slave
  157.     if (memcmp(slave_rx_data, master_tx_data, TEST_LEN_BYTE) == E_NO_ERROR) {
  158.         printf("Data is verified.\n\n");
  159.     } else {
  160.         printf("Data mismatch between slave_rx and master_tx\n\n");
  161.     }

  162.     // Print the data
  163.     for(j = 0; j < TEST_LEN; j++) {
  164.         printf("master data %x  | slave data %x \n", slave_tx_data[j], master_rx_data[j]);
  165.     }

  166.     // Check the data sent from Slave to Master
  167.     if (memcmp(master_rx_data, slave_tx_data, TEST_LEN_BYTE) == E_NO_ERROR) {
  168.         printf("Data is verified.\n\n");
  169.     } else {
  170.         printf("Data mismatch between master_rx and slave_tx_data.\n\n");
  171.     }


  172.     Console_Init();
  173.     printf("\n Done testing \n");


  174.     return 0;
  175. }
复制代码
连接4对引线,成功运行。
改了下用spi1B口和用板提供按键pb,放Console的接口
  1. /**
  2. * @file    main.c
  3. * @brief   SPI Master Demo
  4. * @details Shows Master loopback demo for SPI0 (AKA: SPI17Y) and SPI1 (AKA: SPIMSS)
  5. *          Read the printf() for instructions
  6. */

  7. /*******************************************************************************
  8. * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
  9. *
  10. * Permission is hereby granted, free of charge, to any person obtaining a
  11. * copy of this software and associated documentation files (the "Software"),
  12. * to deal in the Software without restriction, including without limitation
  13. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  14. * and/or sell copies of the Software, and to permit persons to whom the
  15. * Software is furnished to do so, subject to the following conditions:
  16. *
  17. * The above copyright notice and this permission notice shall be included
  18. * in all copies or substantial portions of the Software.
  19. *
  20. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21. * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  23. * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
  24. * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  25. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  26. * OTHER DEALINGS IN THE SOFTWARE.
  27. *
  28. * Except as contained in this notice, the name of Maxim Integrated
  29. * Products, Inc. shall not be used except as stated in the Maxim Integrated
  30. * Products, Inc. Branding Policy.
  31. *
  32. * The mere transfer of this software does not imply any licenses
  33. * of trade secrets, proprietary technology, copyrights, patents,
  34. * trademarks, maskwork rights, or any other form of intellectual
  35. * property whatsoever. Maxim Integrated Products, Inc. retains all
  36. * ownership rights.
  37. *
  38. * $Date: 2018-08-08 11:43:44 -0500 (Wed, 08 Aug 2018) $
  39. * $Revision: 36747 $
  40. *
  41. ******************************************************************************/

  42. /***** Includes *****/
  43. #include <stdio.h>
  44. #include <stdint.h>
  45. #include <string.h>
  46. #include "pb.h"
  47. #include "mxc_config.h"
  48. #include "led.h"
  49. #include "mxc_pins.h"
  50. #include "mxc_delay.h"
  51. #include "tmr.h"
  52. #include "tmr_utils.h"
  53. #include "uart.h"
  54. #include "spi.h"

  55. /***** Definitions *****/
  56. #define TEST_LEN           60
  57. #define TEST_LEN_BYTE      120
  58. #define CLOCK_RATE         6000000  // Bit Rate

  59. #define TEST_MASTER SPI1B
  60. #define TEST_MASTER_IRQ SPI1_IRQn

  61. #define TEST_SLAVE SPI0A
  62. #define TEST_SLAVE_IRQ SPI0_IRQn
  63. volatile int buttonPressed = 0;

  64. /***** Globals *****/
  65. uint16_t master_rx_data[TEST_LEN];
  66. uint16_t master_tx_data[TEST_LEN];
  67. uint16_t slave_rx_data[TEST_LEN];
  68. uint16_t slave_tx_data[TEST_LEN];
  69. volatile int spi_slave_flag;
  70. volatile int spi_master_flag;
  71. uint16_t count=0;
  72. uint16_t count1=0;
  73. uint16_t countm=0;
  74. uint16_t countm1=0;
  75. uint32_t ticks[5];
  76. uint16_t deccount=0;
  77.   //  gpio_cfg_t toggle = {PORT_0, PIN_9, GPIO_FUNC_OUT, GPIO_PAD_NONE};

  78. /***** Functions *****/

  79. void spi_master_cb(void *req, int error)
  80. {
  81.     spi_master_flag = error;
  82.     countm1++;
  83. }
  84. void spi_slave_cb(void *req, int error)
  85. {
  86.     spi_slave_flag = error;
  87.     count1++;
  88. }
  89. void SPI0_IRQHandler(void)
  90. {
  91.     SPI_Handler(SPI0A);
  92.     countm++;
  93. }

  94. void SPI1_IRQHandler(void)
  95. {
  96.     SPI_Handler(SPI1B);
  97.     count++;

  98. }
  99. void buttonHandler(void *pb)
  100. {

  101.   buttonPressed = 1;
  102. }

  103. int main(void)
  104. {
  105.     tmr_cfg_t tmr;
  106.     uint32_t period_ticks;

  107.     TMR_Disable(MXC_TMR2);

  108.     TMR_Init(MXC_TMR2, TMR_PRES_1, 0);


  109.     tmr.mode = TMR_MODE_CONTINUOUS;
  110.     tmr.cmp_cnt = 0xffffffff;
  111.     tmr.pol = 0;

  112.     TMR_Config(MXC_TMR2, &tmr);

  113.     TMR_Enable(MXC_TMR2);
  114.     period_ticks=TMR_GetCount(MXC_TMR2);
  115.     printf("MXC_TMR2 timer started.TMR_GetCount(MXC_TMR2) is %d\n",TMR_GetCount(MXC_TMR2));
  116.     /* Configure wake-up for GPIO pin corresponding to pushbutton */
  117.     LP_EnableGPIOWakeup((gpio_cfg_t *)&pb_pin[0]);
  118.     PB_RegisterCallback(0, buttonHandler);
  119.     printf("LP_EnableGPIOWakeup started.TMR_GetCount(MXC_TMR2) is %d\n",TMR_GetCount(MXC_TMR2));

  120.     int j;
  121.     spi_req_t master_req; // Initialize SPI Request struct for Master
  122.     spi_req_t slave_req;  // Initialize SPI Request struct for Slave


  123.     NVIC_EnableIRQ(TEST_MASTER_IRQ);
  124.     NVIC_EnableIRQ(TEST_SLAVE_IRQ);

  125.     printf("\n************** SPI Master and Slave Demo ****************\n");
  126.     printf("This example configures the SPI to send data between the SPI0 and SPI1. Connect SCK (P0.6) to SCK (P0.2)\n");
  127.     printf("MOSI (P0.5) to MOSI (P0.1), MISO (P0.4) to MISO (P0.0) and SSEL (P0.7) to SSEL(P0.3)  Connect these two pins together.\n");
  128.     printf("This demo shows SPI sending different bit sizes each run through. \n");
  129. printf(
  130.                         " An interrupt is set up on P0.12.  when that interrupt occurs.using a push button (S1) to start  SPI Master and Slave 60-count\n\n");



  131.     // Initialize the tx_data
  132.     for(j = 0; j < TEST_LEN; j++) {
  133.         master_tx_data[j] = j;
  134.         slave_tx_data[j] = TEST_LEN-j;
  135.     }

  136.     // Configure the peripheral
  137.     if(SPI_Init(TEST_MASTER , 0, CLOCK_RATE) != E_NO_ERROR) {
  138.         Console_Init();
  139.         printf("Error configuring SPI\n");
  140.         while(1) {}
  141.     }

  142.     if(SPI_Init(TEST_SLAVE , 0, CLOCK_RATE ) != E_NO_ERROR) {
  143.         Console_Init();
  144.         printf("Error configuring SPI\n");
  145.         while(1) {}
  146.     }

  147.     // Initialize RX buffer to store data
  148.     memset(master_rx_data, 0x0, TEST_LEN_BYTE);
  149.     memset(slave_rx_data,  0x0, TEST_LEN_BYTE);
  150.   //  GPIO_Config(&toggle);

  151.     // Initialize spi_reqest struct for Master
  152.     master_req.ssel = 0;
  153.     master_req.ssel_pol = SPI_POL_LOW;
  154.     master_req.deass = 1;
  155.     master_req.tx_data = master_tx_data;
  156.     master_req.rx_data = master_rx_data;
  157.     master_req.len = TEST_LEN;
  158.     master_req.width = SPI0_WIDTH_1;
  159.     master_req.bits = 8;
  160.     master_req.rx_num = 0;
  161.     master_req.tx_num = 0;
  162.     master_req.callback = spi_master_cb;

  163.     // Initialize spi_request struct for slave
  164.     master_req.ssel = 0;
  165.     slave_req.ssel_pol = SPI_POL_LOW;
  166.     slave_req.tx_data = slave_tx_data;
  167.     slave_req.rx_data = slave_rx_data;
  168.     slave_req.len = TEST_LEN;
  169.     slave_req.width = SPI0_WIDTH_1;
  170.     slave_req.bits = 8;
  171.     slave_req.tx_num = 0;
  172.     slave_req.rx_num = 0;
  173.     slave_req.callback = spi_slave_cb;

  174.     spi_master_flag =1;
  175.     spi_slave_flag =1;


  176.     // delay before UART shutdown
  177.     printf("time tick:%d\n tick over%d. \n",period_ticks,TMR_GetCount(MXC_TMR2)-period_ticks);
  178.     //printf("delay before UART shutdown. \n");
  179.     //while (UART_Busy(MXC_UART_GET_UART(CONSOLE_UART)));
  180.     //Console_Shutdown();


  181.     // Initiate the Slave Async first before Master Sync to make sure
  182.     // data can be received and no data lost when master initiates communication

  183.     ticks[0]=TMR_GetCount(MXC_TMR2);
  184.         const sys_cfg_tmr_t sys_tmr_cfg = {0};  // Do not enable timer output.
  185.     SPI_SlaveTransAsync(TEST_SLAVE, &slave_req);
  186.     SPI_MasterTrans(TEST_MASTER, &master_req);
  187.     //while (spi_slave_flag == 1);
  188.     while (1) {
  189.             if (buttonPressed) {
  190.                             printf("\n************** SPI   slave_rx_data Slave is %d ****************\n",deccount++);
  191.                    printf("time  start :%d:tick over-spi-end:%d. \n",period_ticks,ticks[1]);
  192.                    printf("tick-spi_master count :%d:tick-spi_master_flag count:%d. \n",countm,countm1);
  193.                    printf("tick-spi_slave count :%d:tick-spi_slave_flag count:%d. \n",count,count1);
  194.                    printf("MXC_TMR2 timer .TMR_GetCount(MXC_TMR2) is %d\n",TMR_GetCount(MXC_TMR2));
  195.                    printf("\n************** SPI   slave_rx_data Slave is %d    start  ****************\n",deccount);

  196.                            if( deccount>59){
  197.                                    deccount=0;
  198.                            }
  199.                    for(j = 0; j < deccount; j++) {

  200.                        slave_rx_data[TEST_LEN-j-1]=0xff;
  201.                    }
  202.                    slave_req.len = TEST_LEN-deccount;
  203.                    // delay before UART shutdown
  204.                    printf("time tick:%d\n tick over%d. \n",period_ticks,TMR_GetCount(MXC_TMR2)-period_ticks);

  205.                    // Configure the peripheral
  206.                    if(SPI_Init(TEST_MASTER , 0, CLOCK_RATE) != E_NO_ERROR) {
  207.                        Console_Init();
  208.                        printf("Error configuring SPI\n");
  209.                        while(1) {}
  210.                    }

  211.                    if(SPI_Init(TEST_SLAVE , 0, CLOCK_RATE ) != E_NO_ERROR) {
  212.                        Console_Init();
  213.                        printf("Error configuring SPI\n");
  214.                        while(1) {}
  215.                    }
  216.     // Initialize spi_reqest struct for Master
  217.     master_req.ssel = 0;
  218.     master_req.ssel_pol = SPI_POL_LOW;
  219.     master_req.deass = 1;
  220.     master_req.tx_data = master_tx_data;
  221.     master_req.rx_data = master_rx_data;
  222.     master_req.len = TEST_LEN;
  223.     master_req.width = SPI0_WIDTH_1;
  224.     master_req.bits = 8;
  225.     master_req.rx_num = 0;
  226.     master_req.tx_num = 0;
  227.     master_req.callback = spi_master_cb;

  228.     // Initialize spi_request struct for slave
  229.     master_req.ssel = 0;
  230.     slave_req.ssel_pol = SPI_POL_LOW;
  231.     slave_req.tx_data = slave_tx_data;
  232.     slave_req.rx_data = slave_rx_data;

  233.     slave_req.width = SPI0_WIDTH_1;
  234.     slave_req.bits = 8;
  235.     slave_req.tx_num = 0;
  236.     slave_req.rx_num = 0;
  237.     slave_req.callback = spi_slave_cb;
  238.                    ticks[0]=TMR_GetCount(MXC_TMR2);
  239.                    SPI_SlaveTransAsync(TEST_SLAVE, &slave_req);
  240.                    SPI_MasterTrans(TEST_MASTER, &master_req);
  241.                     // Delay for switch debouncing.
  242.                     TMR_Delay(MXC_TMR0, MSEC(100), &sys_tmr_cfg);
  243.                     // Re-ARM switch detection.
  244.                 printf(" buttonPressed is ON      count = %d\n", count++);
  245.                     buttonPressed = 0;
  246.             }


  247.         while(spi_slave_flag == 1){for(j = 0; j < 1; j++) ;}
  248.         else{

  249.        ticks[1]=TMR_GetCount(MXC_TMR2);
  250.        //Console_Init();
  251.        // Print the data
  252.        for(j = 0; j < TEST_LEN; j++) {
  253.            printf("master data %x  | slave data %x \n", master_tx_data[j], slave_rx_data[j]);
  254.        }

  255.        // Check the data sent from Master to Slave
  256.        if (memcmp(slave_rx_data, master_tx_data, TEST_LEN_BYTE) == E_NO_ERROR) {
  257.            printf("Data is verified.\n\n");
  258.        } else {
  259.            printf("Data mismatch between slave_rx and master_tx\n\n");
  260.        }

  261.        // Print the data
  262.        for(j = 0; j < TEST_LEN; j++) {
  263.            printf("master data %x  | slave data %x \n", slave_tx_data[j], master_rx_data[j]);
  264.        }

  265.        // Check the data sent from Slave to Master
  266.        if (memcmp(master_rx_data, slave_tx_data, TEST_LEN_BYTE) == E_NO_ERROR) {
  267.            printf("Data is verified.\n\n");
  268.        } else {
  269.            printf("Data mismatch between master_rx and slave_tx_data.\n\n");
  270.        }


  271.        //Console_Init();
  272.        printf("\n Done testing \n");
  273.        printf("time tick-spi start :%d:tick over-spi-end:%d. \n",ticks[0],ticks[1]);
  274.        printf("tick-spi_master count :%d:tick-spi_master_flag count:%d. \n",countm,countm1);
  275.        printf("tick-spi_slave count :%d:tick-spi_slave_flag count:%d. \n",count,count1);
  276.        printf("MXC_TMR2 timer .TMR_GetCount(MXC_TMR2) is %d\n",TMR_GetCount(MXC_TMR2));
  277.        spi_slave_flag =1;
  278.        }
  279.     }

  280. }
复制代码
没成功,程序停在了MXC_AssertionsSPI17Y处,
之后再调试或运行程序都烧写不了代码了,估计与没有关和开控制台Console_Init和Console_Shutdown();有关。


0
2019-4-17 11:24:16   评论 分享淘帖 邀请回答

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

我要提问
课程
    关闭

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

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