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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2021-11-04 j1