spi qu

1、spi 驱动核心这两个:

icm20608_read_regs
 
    /* 一共发送len+1个字节的数据,第一个字节为
    寄存器首地址,一共要读取len个字节长度的数据,*/
    txdata[0] = reg | 0x80;        /* 写数据的时候首寄存器地址bit8要置1 */            
    t->tx_buf = txdata;            /* 要发送的数据 */
    t->rx_buf = rxdata;            /* 要读取的数据 */
    t->len = len+1;                /* t->len=发送的长度+读取的长度 */
    spi_message_init(&m);        /* 初始化spi_message */
    spi_message_add_tail(t, &m);/* 将spi_transfer添加到spi_message队列 */
    ret = spi_sync(spi, &m);    /* 同步发送 */
    if(ret) {
        goto out2;
    }
    
    memcpy(buf , rxdata+1, len);  /* 只需要读取的数据 */

 

 
icm20608_write_regs
    /* 一共发送len+1个字节的数据,第一个字节为
    寄存器首地址,len为要写入的寄存器的集合,*/
    *txdata = reg & ~0x80;    /* 写数据的时候首寄存器地址bit8要清零 */
    memcpy(txdata+1, buf, len);    /* 把len个寄存器拷贝到txdata里,等待发送 */
    t->tx_buf = txdata;            /* 要发送的数据 */
    t->len = len+1;                /* t->len=发送的长度+读取的长度 */
    spi_message_init(&m);        /* 初始化spi_message */
    spi_message_add_tail(t, &m);/* 将spi_transfer添加到spi_message队列 */
    ret = spi_sync(spi, &m);    /* 同步发送 */
    if(ret) {
        goto out2;
    }
    

 

2、单板上的--:

主要是

icm20608_read_len
icm20608_read_reg //单字节形式
 
icm20608_write_reg
 
/*
 * @description    : 读取ICM20608寄存器值
 * @param - reg    : 要读取的寄存器地址
 * @return         : 读取到的寄存器值
 */
unsigned char icm20608_read_reg(unsigned char reg)
{
    unsigned char reg_val;           

    /* ICM20608在使用SPI接口的时候寄存器地址
     * 只有低7位有效,寄存器地址最高位是读/写标志位
     * 读的时候要为1,写的时候要为0。
     */
    reg |= 0x80;     
    
    ICM20608_CSN(0);                                   /* 使能SPI传输             */
    spich0_readwrite_byte(ECSPI3, reg);             /* 发送寄存器地址          */ 
    reg_val = spich0_readwrite_byte(ECSPI3, 0XFF);    /* 读取寄存器的值             */
    ICM20608_CSN(1);                                /* 禁止SPI传输             */
    return(reg_val);                                    /* 返回读取到的寄存器值 */
}

 

/*
 * @description  : 写ICM20608指定寄存器
 * @param - reg  : 要读取的寄存器地址
 * @param - value: 要写入的值
 * @return         : 无
 */
void icm20608_write_reg(unsigned char reg, unsigned char value)
{
    /* ICM20608在使用SPI接口的时候寄存器地址
     * 只有低7位有效,寄存器地址最高位是读/写标志位
     * 读的时候要为1,写的时候要为0。
     */
    reg &= ~0X80;    
    
    ICM20608_CSN(0);                        /* 使能SPI传输            */
    spich0_readwrite_byte(ECSPI3, reg);     /* 发送寄存器地址        */ 
    spich0_readwrite_byte(ECSPI3, value);    /* 发送要写入的值            */
    ICM20608_CSN(1);                        /* 禁止SPI传输            */
}    

 

#define ICM20608_CSN(n)    (n ? gpio_pinwrite(GPIO1, 20, 1) : gpio_pinwrite(GPIO1, 20, 0))   /* SPI片选信号     */


/*
 * @description        : SPI通道0发送/接收一个字节的数据
 * @param - base    : 要使用的SPI
 * @param - txdata    : 要发送的数据
 * @return             : 无
 */
unsigned char spich0_readwrite_byte(ECSPI_Type *base, unsigned char txdata)
{ 
    uint32_t  spirxdata = 0;
    uint32_t  spitxdata = txdata;

    /* 选择通道0 */
    base->CONREG &= ~(3 << 18);
    base->CONREG |= (0 << 18);

      while((base->STATREG & (1 << 0)) == 0){} /* 等待发送FIFO为空 */
        base->TXDATA = spitxdata;
    
    while((base->STATREG & (1 << 3)) == 0){} /* 等待接收FIFO有数据 */
        spirxdata = base->RXDATA;
    return spirxdata;
}

 

posted @ 2022-11-04 15:06  cnchengv  阅读(69)  评论(0编辑  收藏  举报