TI中文支持网
TI专业的中文技术问题搜集分享网站

spi外扩设备

由于omapl138没有can通信接口,我用spi外扩了两个can接口,通过spi连接两个can控制器(mcp2515),将spi配置为4线模式,通过cs信号来选择使用那个can控制器通信。

原理图如下:

我的spi初始化代码如下:

void spi_init(void)
{
void __iomem *spi_regs_base_virt = ioremap(SPI_SPIGCR0,0x70);
void __iomem *gcr0_reg_virt=spi_regs_base_virt;
void __iomem *gcr1_reg_virt=spi_regs_base_virt+0x04;
void __iomem *pc0_reg_virt=spi_regs_base_virt+0x14;
void __iomem *fmt0_reg_virt=spi_regs_base_virt+0x50;
void __iomem *data1_reg_virt=spi_regs_base_virt+0x3c;
void __iomem *delay_reg_virt=spi_regs_base_virt+0x48;
void __iomem *int0_reg_virt=spi_regs_base_virt+0x08; void __iomem *def_reg_virt=spi_regs_base_virt+0x4C; void __iomem *pc1_reg_virt=spi_regs_base_virt+0x18; void __iomem *pc3_reg_virt=spi_regs_base_virt+0x20;
unsigned long reg_val;
reg_val = 0;
iowrite32(reg_val, gcr0_reg_virt); //复位SPI
reg_val = 1;
iowrite32(reg_val, gcr0_reg_virt); //SPI为工作状态

reg_val = 0;
reg_val = (0<<24)|(0<<16)|(1<<1)|(1<<0);
iowrite32(reg_val, gcr1_reg_virt); reg_val = 0;
reg_val = ioread32(pc1_reg_virt);
reg_val |=(1<<0);
//// reg_val = (0<<0);
iowrite32(reg_val, pc1_reg_virt); reg_val = 0;
reg_val = ioread32(pc3_reg_virt);
reg_val |=(1<<0);
iowrite32(reg_val, pc3_reg_virt);

reg_val = 0;
reg_val = (1<<11)|(1<<10)|(1<<9)|(1<<0);
iowrite32(reg_val, pc0_reg_virt); reg_val = 0;
reg_val = (0<<24)|(1<<20)|(0<<17)|(1<<16)|(4<<8)|(8<<0); //(4<<8)改变SPI的波特率数值范围2——FF 速率SPI MODULE/PERSCALE+1
iowrite32(reg_val, fmt0_reg_virt); reg_val = 0;
reg_val = (1<<28)|(0<<26)|(0<<24)|(0<<16); iowrite32(reg_val, data1_reg_virt);// reg_val = 1;
// iowrite32(reg_val, def_reg_virt);
reg_val = 0;
reg_val = (0<<24)|(0<<16); iowrite32(reg_val, delay_reg_virt);

// reg_val = 0;
// reg_val = (0<<16)|(0<<8)|(0<<6)|(1<<4);// iowrite32(reg_val, int0_reg_virt);
reg_val = 0;
reg_val = ioread32(gcr1_reg_virt);
reg_val &= ~(0x1<<24); reg_val |= 1<<24; //使能SPI
iowrite32(reg_val,gcr1_reg_virt); iounmap(spi_regs_base_virt);
}

将spi_miso\spi_mosi\spi_clk信号复用为spi功能,cs做为gpio来选者使用哪个can控制器。现在用示波器测量能spi能输出数据,时钟信号也有;但是不能将mcp2515驱动起来。

mcp2515要求时钟频率不能超过10MHZ,但是我测量的spi出来的时钟频率为25mhz,通过SPIFMT0寄存器配置(4<<8),我将时钟频率变小配置,即将SPIFMT0寄存器中对应位PRESCALE置大点,但是我发现spi时钟频率降低不到我所需要的10MHZ,而且PRESCALE值置为8时,spi模块就没有时钟输出了,手册上写的是2-FF,请大家帮我解决下吧!谢谢

Tony Tang:

我想是哪里搞错了,因为我查看了一下starterware里的spi_edma例程里的配置如下,就是配置的10MHz,不妨参考一下starterware里的例子吧。

spiedma.c

    /* Configures the Prescale bit in Data Format register. */    SPIClkConfigure(SOC_SPI_1_REGS, 150000000, 10000000, SPI_DATA_FORMAT0);

spi.c:

void SPIClkConfigure(unsigned int baseAdd, unsigned int moduleClk,                     unsigned int spiClk, unsigned int dataFormat){    unsigned int prescale;

    prescale = (moduleClk/spiClk) – 1;

    HWREG(baseAdd + SPI_SPIFMT(dataFormat)) =  \        (SPI_SPIFMT_PRESCALE & (prescale << SPI_SPIFMT_PRESCALE_SHIFT));}

赞(0)
未经允许不得转载:TI中文支持网 » spi外扩设备
分享到: 更多 (0)