Autor Tema: SPI2 en Teensy 3.5  (Leído 1528 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
SPI2 en Teensy 3.5
« en: 16 de Noviembre de 2017, 22:40:15 »
 

¿ Por casualidad sabreis si es posible usar SPI2 en un Teensy 3.5 ?.
A los efectos es usar SPI2 en un Kinetis MK64, usando el entorno de Arduino.

Hice un diseño de hardware, que mezcla dos diseños que por separado cada uno estaba usando SPI0, y aunque en el nuevo diseño los he conectado a pines diferentes del MK64, creo que no es posible usar al mismo tiempo los pines de SPI0 y SPI0 alternativo para usarlos como si fueran dos puertos SPI distintos.

Entiendo que si tenemos SPI0 con pines distintos en el mismo chip, solo puede funcionar uno de ellos.

En el mismo diseño, puse unos jumpers soldables, para poder asignar a uno de los dos periféricos, el SPI2 o el SPI0 (con pines alternativos), pero no tengo claro si lo puedo usar con las librerías SPI de Arduino/Teensy.

Hay unos comandos para poder reasignar los pines de SPI, pero me parece que solo son para usar los pines alternativos de SPI0.

Estos serían los comandos, si pudiera reasignar a SPI2, aún no lo he probado, igual funciona. Mi duda es también si pueden coexistir SPI0 y SPI2 en este entorno Teensy/Arduino

SPI.setMOSI(44); // SPI2 MOSI, PTB22
SPI.setMISO(45); // SPI2 MISO,  PTB23
SPI.setSCK(46); // SPI2 SCK, PTB21

« Última modificación: 16 de Noviembre de 2017, 22:48:01 por planeta9999 »

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 255
Re:SPI2 en Teensy 3.5
« Respuesta #1 en: 17 de Noviembre de 2017, 12:51:26 »
No tendrás que cambiar SPI por SPI2 o SPI1. Cuando tienes varios UART por hardware, lo que ves es Serial1,Serial2, etc.

Probablemente sea lo mismo.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:SPI2 en Teensy 3.5
« Respuesta #2 en: 17 de Noviembre de 2017, 16:39:29 »


Ya he averiguado algo, pero aquí es más complicado.

Se trata de una librería para usar un controlador Ethernet W5500 por SPI. El problema es que en desarrollos con Teensy bajo Arduino, tienen la mala costumbre, cuando usan SPI, de asignarlo fijo a SPI0. Asi esta en la libreria SPI de Arduino, SPI siempre es SPI0.

Ya he estado mirando los fuentes de la librería y creo que se como cambiarlo a SPI2, para el W5500, así me queda libre SPI0 para el otro periférico que además usa DMA,  y un tarjetero SD por SDIO, que usa parte de los pines del SPI1.

Lo peor es la manera que tiene Arduino de asignar nombres a los pines, que no tiene nada que ver con los nombres de los puertos del datasheet, aunque ya me voy acostumbrando.

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 255
Re:SPI2 en Teensy 3.5
« Respuesta #3 en: 17 de Noviembre de 2017, 20:31:07 »
Wiznet provee su propia librería

https://github.com/Wiznet/ioLibrary_Driver

No presuponen nada, tan sólo tienes que asignarles funciones correspondientes al manejo del pin CS y la parte de escritura, lectura del SPI y algunas otras definiciones.

Código: C
  1. typedef struct __WIZCHIP
  2. {
  3.    uint16_t  if_mode;               ///< host interface mode
  4.    uint8_t   id[6];                 ///< @b WIZCHIP ID such as @b 5100, @b 5200, @b 5500, and so on.
  5.    /**
  6.     * The set of critical section callback func.
  7.     */
  8.    struct _CRIS
  9.    {
  10.       void (*_enter)  (void);       ///< crtical section enter
  11.       void (*_exit) (void);         ///< critial section exit  
  12.    }CRIS;  
  13.    /**
  14.     *  The set of @ref \_WIZCHIP_ select control callback func.
  15.     */
  16.    struct _CS
  17.    {
  18.       void (*_select)  (void);      ///< @ref \_WIZCHIP_ selected
  19.       void (*_deselect)(void);      ///< @ref \_WIZCHIP_ deselected
  20.    }CS;  
  21.    /**
  22.     * The set of interface IO callback func.
  23.     */
  24.    union _IF
  25.    {     
  26.       /**
  27.        * For BUS interface IO
  28.        */
  29.       //M20156501 : Modify the function name for integrating with W5300
  30.       //struct
  31.       //{
  32.       //   uint8_t  (*_read_byte)  (uint32_t AddrSel);
  33.       //   void     (*_write_byte) (uint32_t AddrSel, uint8_t wb);
  34.       //}BUS;      
  35.       struct
  36.       {
  37.          iodata_t  (*_read_data)   (uint32_t AddrSel);
  38.          void      (*_write_data)  (uint32_t AddrSel, iodata_t wb);
  39.       }BUS;      
  40.  
  41.       /**
  42.        * For SPI interface IO
  43.        */
  44.       struct
  45.       {
  46.          uint8_t (*_read_byte)   (void);
  47.          void    (*_write_byte)  (uint8_t wb);
  48.          void    (*_read_burst)  (uint8_t* pBuf, uint16_t len);
  49.          void    (*_write_burst) (uint8_t* pBuf, uint16_t len);
  50.       }SPI;
  51.       // To be added
  52.       //
  53.    }IF;
  54. }_WIZCHIP;

Otra cosa que te recomendaría, ya que estas usando tarjetas SD, es que actualices a la última versión de la biblioteca para manejarlas. La última versión esta en https://github.com/greiman/SdFat , el autor cambió la licencia de GPL3 a MIT.

La versión que viene con arduino (1.8.5) esta bajo GPL3, y pues al ser una obra derivada tendrías que soltar el código fuente de tu aplicación.

aquí esta el commit donde hace el cambio

https://github.com/greiman/SdFat/commit/e4190e50a4ed83c73fb046b7fce2694e8cfe2ddb

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:SPI2 en Teensy 3.5
« Respuesta #4 en: 18 de Noviembre de 2017, 01:42:22 »


Gracias, lo miraré, pero ahora ya lo tengo todo más o menos funcionando y como dice el refrán "si algo funciona no lo toques".

Además es para un proyecto bajo encargo que tengo que entregarlo cuanto antes, no me puedo liar a investigar y cambiar cosas que en la práctica no van a suponer que el producto funcione mejor.

Menos mal que en la placa del prototipo tuve la precaución de poner uno de los dos SPI con puentes soldables, para poder configurarlo por SPI2 o SPI0 con pines alternativos, si no ahora mismo tendría que hacer una nueva placa y el cliente ya se está poniendo nervioso.