Portapack应用开发教程 (十六)Debug程序 H hackrf固件比较

本文详细分析了PortaPack固件中的SPI通信原理及实现方式,特别是针对Flash芯片W25Q80BV的配置过程,并对比了MAX2837和MAX5864芯片的不同。

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值