#include #include "spi.h" /* * spi driver for ML5238 and CS1180 */ void spi0_init(void){ rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_SPI0); gpio_mode_af(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5); gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3|GPIO_PIN_5); ml5238_cs(1); spi_i2s_deinit(SPI0); spi_parameter_struct spi_init_struct; /* SPI0 parameter config */ spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; spi_init_struct.device_mode = SPI_MASTER; spi_init_struct.frame_size = SPI_FRAMESIZE_16BIT; spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; spi_init_struct.nss = SPI_NSS_SOFT; spi_init_struct.prescale = SPI_PSC_32 ; spi_init_struct.endian = SPI_ENDIAN_MSB; spi_init(SPI0, &spi_init_struct); /* set crc polynomial */ spi_crc_polynomial_set(SPI0,7); /* enable SPI0 */ spi_enable(SPI0); } void spi0_deinit(void){ spi_disable(SPI0); rcu_periph_clock_disable(RCU_SPI0); gpio_mode_input(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5); } void spi1_init(void){ rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_SPI1); gpio_mode_af(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_13|GPIO_PIN_15); gpio_mode_af(GPIOB, GPIO_PUPD_PULLUP, GPIO_PIN_14); gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13|GPIO_PIN_15); spi_i2s_deinit(SPI1); spi_parameter_struct spi_init_struct; /* SPI1 parameter config */ spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; spi_init_struct.device_mode = SPI_MASTER; spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE; spi_init_struct.nss = SPI_NSS_SOFT; spi_init_struct.prescale = SPI_PSC_128 ; spi_init_struct.endian = SPI_ENDIAN_MSB; spi_init(SPI1, &spi_init_struct); /* set crc polynomial */ spi_crc_polynomial_set(SPI1,7); /* enable SPI1 */ spi_enable(SPI1); } void spi1_deinit(void){ spi_disable(SPI1); rcu_periph_clock_disable(RCU_SPI1); gpio_mode_input(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15); } #define max_wait_count 1024 int spi0_send_uint16(uint16_t s_data, uint8_t *r_data) { /* loop while data register in not emplty */ int count = 0; while (RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_TBE) && count < max_wait_count){ count ++; }; if (RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_TBE)){ return -1; } /* send byte through the SPI0 peripheral */ spi_i2s_data_transmit(SPI0,s_data); /* wait to receive a byte */ count = 0; while(RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_RBNE) && count < max_wait_count){ count ++; }; if (RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_RBNE)){ return -1; } /* return the byte read from the SPI bus */ uint8_t r = spi_i2s_data_receive(SPI0); if (r_data != NULL){ *r_data = r; } return 0; } #define max_wait1_count 4096 int spi1_send_byte(uint8_t byte, uint8_t *r_data) { /* loop while data register in not emplty */ int count = 0; while (RESET == spi_i2s_flag_get(SPI1,SPI_FLAG_TBE) && count < max_wait1_count){ count ++; }; if (RESET == spi_i2s_flag_get(SPI1,SPI_FLAG_TBE)){ return -1; } /* send byte through the SPI1 peripheral */ spi_i2s_data_transmit(SPI1,byte); /* wait to receive a byte */ count = 0; while(RESET == spi_i2s_flag_get(SPI1,SPI_FLAG_RBNE) && count < max_wait1_count){ count ++; }; if (RESET == spi_i2s_flag_get(SPI1,SPI_FLAG_RBNE)){ return -1; } /* return the byte read from the SPI bus */ uint8_t r = spi_i2s_data_receive(SPI1); if (r_data != NULL){ *r_data = r; } return 0; }