portapack固件的芯片驱动看得差不多了。我们知道了这些芯片分为3类,iic通信、软件spi、硬件spi。
接下来我们打开hackrf固件,看看flash芯片是哪类。然后看看它与同类别的其它芯片有哪些细微差别,一步步把这些差别改到portapack固件里去。
打开hackrf/firmware/common/
可以看到这几个文件max2837.c max2837_target.c | max5864.c max5864_target.c | rffc5071.c rffc5071_spi.c | w25q80bv.c w25q80bv_target.c | si5351c.c
光从命名方式来看我们要找的flash芯片——w25q80bv跟max2837 max5864是一样的。说明flash芯片也是硬件spi总线连接的。
接下来我们具体看看之前已经比较熟悉的3个芯片 max2837 max5864与rffc5071是如何用不同方式实现spi通信的。
我一开始有点看不明白,如果你打开下面3个芯片驱动:
firmware/common/rffc5071.c max2837.c max5864.c
static uint16_t rffc5071_spi_read(rffc5071_driver_t* const drv, uint8_t r) {
(void)drv;
uint16_t data[] = { 0x80 | (r & 0x7f), 0xffff };
spi_bus_transfer(drv->bus, data, 2);
return data[1];
}
static void rffc5071_spi_write(rffc5071_driver_t* const drv, uint8_t r, uint16_t v) {
(void)drv;
uint16_t data[] = { 0x00 | (r & 0x7f), v };
spi_bus_transfer(drv->bus, data, 2);
}
static uint16_t max2837_read(max2837_driver_t* const drv, uint8_t r) {
uint16_t value = (1 << 15) | (r << 10);
spi_bus_transfer(drv->bus, &value, 1);
return value & 0x3ff;
}
static void max2837_write(max2837_driver_t* const drv, uint8_t r, uint16_t v) {
uint16_t value = (r << 10) | (v & 0x3ff);
spi_bus_transfer(drv->bus, &value, 1);
}
static void max5864_write(max5864_driver_t* const drv, uint8_t value) {
spi_bus_transfer(drv->bus, &value, 1);
}
会发现凡是跟读写寄存器有关的代码,最终都在调用spi_bus_transfer。乍看之下调用了同一个函数,这是为什么?
后来我找到spi_bus_transfer函数的实现,在firmware/common/spi_bus.c
void spi_bus_transfer(spi_bus_t* const bus, void* const data, const size_t count) {
bus->transfer(bus, data, count);
}
可以看到这个函数最终调用的下一级transfer函数取决于传入的bus参数。
而不同的芯片传入的参数drv->bus实际上是不一样的,因为drv的类型不一样。分别是rffc5071_driver_t max2837_driver_t max5864_driver_t
因此,实际transfer函数的实现,取决于芯片驱动。
对于rffc5071,实际上这个drv是在rffc5071_setup函数调用的时候传进来的。
我搜索了一下rffc5071_setup,是在mixer.c中调用的。
我摘录了mixer.c里的相关代码:
const rffc5071_spi_config_t rffc5071_spi_config = {
.gpio_select = &gpio_rffc5072_select,
.gpio_clock = &gpio_rffc5072_clock,
.gpio_data = &gpio_rffc5072_data,
};
spi_bus_t spi_bus_rffc5071 = {
.config = &rffc5071_spi_config,
.start

本文详细分析了PortaPack固件中的SPI通信原理及实现方式,特别是针对Flash芯片W25Q80BV的配置过程,并对比了MAX2837和MAX5864芯片的不同。
最低0.47元/天 解锁文章
5万+

被折叠的 条评论
为什么被折叠?



