Spi STM32
Spi STM32
SS SS • SELECCIÓN DE ESCLAVO
SDO
SDI ESLAVO 3
SCK
SS
Situación Final
Intercambiados los 8 bits de
datos
SS SS SS SS
Typedef struct
{
uint32_t Mode Especifica si las transferencias de datos comienzan desde MSB o un bit
uint32_t Direction LSB. Este parámetro puede ser: SPI_FIRSTBIT_MSB SPI_FIRSTBIT_LSB
uint32_t DataSize
uint32_t CLKPolarity
uint32_t CLKPhase
uint32_t NSS
uint32_t BaudRatePrescaler
uint32_t FirstBit Especifica si el modo TI está habilitado o no. Este campo es utilizado
uint32_t TIMode para activar o desactivar la modalidad Texas Instrument. Este parámetro
}SPI_InitTypeDef; puede ser:
SPI_TIMODE_DISABLE SPI_TIMODE_ENABLE
Para inicializar la configuración del periférico se ejecuta la función:
Para el Envío y Recepción de bytes de datos se usan la funciones provistas dentro de la librería HAL.
Si el dispositivo esclavo tiene la capacidad de entablar la comunicacion Full-Duplex se puede usar la siguiente funcion para realizar
la transmission y recepcion de manera simultaneal.
• HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);
• SPIx_IRQHandler( );
Las funciones de interrupcion llama a la function SPIX_IRQHandler( ); que a su vez llamara a una de las siguientes subrutinas
predefinidas:
• HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);
• HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi);
• HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi);
Crear un programa maestro y un programa esclavo entre los cuales se pueda trasmitir un texto desde el
maestro hacia el esclavo en modo sondeo, haciendo uso del periférico SPI. El esclavo debe mostrar este
texto en la consola de una computadora usando el modulo UART.
MAESTRO:
SOLUCIÓN void SPI_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_1LINE;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
__HAL_RCC_SPI1_CLK_ENABLE();
HAL_SPI_Init(&hspi1);
}
Crear un programa maestro y un programa esclavo entre los cuales se pueda trasmitir un texto desde el
maestro hacia el esclavo en modo sondeo, haciendo uso del periférico SPI. El esclavo debe mostrar este
texto en la consola de una computadora usando el modulo UART.
MAESTRO:
SOLUCIÓN
uint8_t texto [12]=“HOLA MUNDO\r\n”;
...
While(1)
{
HAL_SPI_Transmit(&hspi1,texto,sizeof(texto),HAL_MAX_DELAY);
HAL_Delay(500);
}
Crear un programa maestro y un programa esclavo entre los cuales se pueda trasmitir un texto desde el
maestro hacia el esclavo en modo sondeo, haciendo uso del periférico SPI. El esclavo debe mostrar este
texto en la consola de una computadora usando el modulo UART.
ESCLAVO:
SOLUCIÓN void SPI_Init(void)
{
hspi1.Instance = SPI2;
hspi1.Init.Mode = SPI_MODE_SLAVE;
hspi1.Init.Direction = SPI_DIRECTION_1LINE;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_HARD_INPUT ;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
__HAL_RCC_SPI1_CLK_ENABLE();
HAL_SPI_Init(&hspi1);
}
Crear un programa maestro y un programa esclavo entre los cuales se pueda trasmitir un texto desde el
maestro hacia el esclavo en modo sondeo, haciendo uso del periférico SPI. El esclavo debe mostrar este
texto en la consola de una computadora usando el modulo UART.
ESCLAVO:
SOLUCIÓN
char texto1 [12];
...
While(1)
{
HAL_SPI_Receive(&hspi2,texto1,sizeof(texto1),HAL_MAX_DELAY);
HAL_UART_Transmit(&huart1,texto1,sizeof(texto1),HAL_MAX_DELAY);
}
Escribir un programa esclavo SPI, el cual reciba un texto desde el maestro en modo INTERRUPCIÓN,
haciendo uso del periférico SPI. El esclavo debe mostrar este texto en la consola de una computadora
usando el modulo UART.
SOLUCIÓN void MX_SPI_Init(void)
{
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_SLAVE;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
__HAL_RCC_SPI2_CLK_ENABLE();
HAL_SPI_Init(&hspi2);
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_UART1_Init(void);
static void MX_SPI_Init(void);
UART_HandleTypeDef huart1;
SPI_HandleTypeDef hspi2;
char texto[12];
Escribir un programa esclavo SPI, el cual reciba un texto desde el maestro en modo INTERRUPCIÓN,
haciendo uso del periférico SPI. El esclavo debe mostrar este texto en la consola de una computadora
usando el modulo UART. int main(void)
{
SOLUCIÓN HAL_Init();
SystemClock_Config();
MX_HAL_UART1_Init();
MX_GPIO_Init();
MX_SPI_Init();