STM32 SPI MOSI de 3 hilos de alta impedancia

2

Tengo un sensor con una interfaz SSC de 3 hilos, que es compatible con SPI, pero solo tiene una línea de datos bidireccional. Ahora trato de leer este sensor () y me envía los datos de vuelta, pero como MISO y MOSI están en cortocircuito (según lo recomendado por el fabricante del chip), los datos se bloquean después de la resistencia de la línea de datos de 470Ohm, porque MOSI necesita ir a alta impedancia después de la el comando fue enviado.

Entonces, ¿cómo puedo lograr un pin MOSI de alta impedancia en un STM32F410CBU6? Podría definirlo como una entrada, pero luego debo reiniciar la interfaz SPI. ¿Existe una solución más sencilla con menos gastos generales?

Editar: Intenté configurar el SPI en el modo semidúplex. Desde que uso CubeMX, la configuración para esto fue fácil, pero todavía no tengo éxito. Cuando el SPI está en el modo semidúplex, el SCK parece tener un pequeño desplazamiento (tal vez alrededor de 0.4 V) y la línea MOSI también tiene un comportamiento extraño. Cuando cambio al modo dúplex completo, este comportamiento desaparece. Que podria causar esto? Estoy leyendo el sensor que nos gusta esto:

HAL_GPIO_WritePin(SPI_CS_PORT, SPI_CS, LOW);
spi_pos->Instance->CR1 |= (1<<BIDIOE);
HAL_SPI_Transmit(spi_pos,&command,1,1);
spi_pos->Instance->CR1 &= ~(1<<BIDIOE);
asm("nop"); // Since sensor needs some ns to switch to sender mode
HAL_SPI_Receive(spi_pos,data,size,1);
HAL_GPIO_WritePin(SPI_CS_PORT, SPI_CS, HIGH);

El SPI se configura de la siguiente manera:

  /* SPI2 parameter configuration*/
  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_16BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 15;

MOSI Full Duplex:

SCKFullDuplex:

HalfDuplexMOSI:

SCKHalfDuplex:

Edición2:AquíestánlasconfiguracionesenCubeMX:

    
pregunta HansPeterLoft

1 respuesta

4

El periférico SPI del STM32F4 se puede configurar para una transferencia bidireccional bidireccional de un solo cable. En este modo, el pin MOSI se utiliza como maestro o el MISO como esclavo, no es necesario acortar los pines juntos en el lado STM32 ya que solo se usa uno.

Para eso necesitas usar el bit BIDIMODE (= 1) en SPI_CR1 . Para establecer la dirección de los datos, debe usar el bit BIDIOE (1 = salida, 0 = entrada) también en SPI_CR1 .

Entonces, para enviar los datos, establezca BIDIOE a 1 y transfiera todos los datos escribiendo a SPI_DR y luego reinicie BIDIOE a 0 y reciba los datos con un dummy escribiendo algo a SPI_DR (para generar el reloj, que le indicará al esclavo que envíe los datos) y leerá los datos recibidos de SPI_DR .

Todavía no he usado esta función y no uso las bibliotecas periféricas proporcionadas por ST, por lo que no puedo comentar sobre su capacidad para usar esta función.

    
respondido por el Arsenal

Lea otras preguntas en las etiquetas

Comentarios Recientes

regulador. Webcam Bluetooth Escáner. Controles fáciles de usar. Controlador de luz MOSI. Sensor de carga masiva (puede detectar y escanear pulsos entrantes de un determinado producto químico) y placa de controlador de inductor de alto voltaje WIFI Radio infrarroja Atmega32u4 con otro puerto microUSB de 8bay; 9 puertos USB 1x interfaz de bus CAN; Los conectores estándar de 571x148x456 pines a 3.3V no activan la interfaz de bus de imagen infrarroja de 4m con infrarrojo I2C Soporta cámara EDC protegida por imagen... Lees verder