板子跑的linux,我在调spi的时候遇到一个问题就是读写外设的寄存器的时间开销太大。
static void
transfer (int fd)
{
int ret;
uint8_t tx[] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
0xF0, 0x0D,
};
uint8_t rx[ARRAY_SIZE (tx)] = { 0, };
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long) tx,
.rx_buf = (unsigned long) rx,
.len = ARRAY_SIZE (tx),
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl (fd, SPI_IOC_MESSAGE (1), &tr);
上面是spi_write函数的大概内容,其中ioctrl的时间开销就很大,读一次spi(一个字节)需要大约50us的时间(spi配置为3Mbps)。
是有点长,有什么方法可以提高spi读写的效率?
谢谢!
我也发现太慢
等了44us才从SPI输出时钟,应用层到内核层要判断数据合理性,要拷贝,我后来直接用mmap映射SPI物理地址后,在应用层写寄存器(不符合LINUX推荐办法),延时很短,1us延时,当然数据多时,你连贯发也会因为系统时间片切换而被暂停,比如我试验发送64KBYTES,我用30M时钟,计算大约21ms发完,实际是三个包,每个包最长10ms,包中间隔了10ms被系统切走(忙的话还要更多),所以实际50ms左右传完64KBYTES
[ 本帖最后由 mr.king 于 2012-12-7 19:57 编辑 ]
你好,你用的哪种方式读的spi,能不能贴一部分代码?
回复 板凳 agoodog 的帖子
留QQ,周一上班交流
你用的什么驱动?我用的内核自带的spi驱动。你qq多少?