| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #include <string.h>
- #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;
- }
|