芯唐n3292 flash片选疑问
本帖最后由 chengying 于 2014-2-10 19:32 编辑n3292 的demo板关于spi flash设计原理图如下,u6和和u7是共用片选,用spi 0,看底层flash驱动,片选是固定?里边有outpw(REG_SPI0_SSR, inpw(REG_SPI0_SSR) | 0x01); // CS0,为何不用gpio_setportval()函数控制cs0?是为了操作cs0速度快?还是flash的cs0是固定,必须这样控制,我换其他io口控制片选不行吗?
因为spi 1的flash片选是被摄像头数据位占掉了。我系统打算挂一个u6放应用程序,一个u7保存用户数据。若u6和u7不能同时挂总线上,那我设计u7这个flash不是要用spi 1?
我理解应该是u6和u7可以通过不同的片选来共用spi总线。只是芯唐提供的驱动写把片选写死?
非常抓狂,芯唐的驱动能不能多加点注释,资料能不能全点,现在没看一点程序都要打好几个疑问?
INT spiFlashWrite(UINT32 addr, UINT32 len, UINT8 *buf)
{
int volatile count=0, page, i, j;
UINT8 data;
PUINT8 ptr;
PUINT32 p32tmp;
p32tmp = (PUINT32)buf;
usiStatusWrite1(0x00, 0x00); // clear block protect , disable QE
usiStatusRead(0x35, &data);
sysprintf("SpiFlash Register-2 Status 0x%x \n", data);
count = len / 256;
if ((len % 256) != 0)
count++;
for (i=0; i<count; i++)
{
// check data len
if (len >= 256)
{
page = 256;
len = len - 256;
}
else
page = len;
usiWriteEnable();
outpw(REG_SPI0_SSR, inpw(REG_SPI0_SSR) | 0x01); // CS0
// write command
outpw(REG_SPI0_TX0, 0x02);
spiTxLen(0, 0, 8);
spiActive(0);
// address
outpw(REG_SPI0_TX0, addr+i*256);
spiTxLen(0, 0, 24);
spiActive(0);
spiSetByteEndin(0, eDRVSPI_ENABLE);
// write data
while (page > 0)
{
spiTxLen(0, 0, 32);
outpw(REG_SPI0_TX0, *p32tmp);
spiActive(0);
p32tmp++;
page -=4;
if(page < 4)
{
if(page > 0)
{
spiSetByteEndin(0, eDRVSPI_DISABLE);
ptr = (PUINT8)p32tmp;
for (j=0; j<(page %4); j++)
{
spiTxLen(0, 0, 8);
outpw(REG_SPI0_TX0, *ptr);
spiActive(0);
ptr++;
page -=1;
}
}
}
}
outpw(REG_SPI0_SSR, inpw(REG_SPI0_SSR) & 0xfe); // CS0
spiSetByteEndin(0, eDRVSPI_DISABLE);
// check status
usiCheckBusy();
}
return Successful;
}
原参考设计是选一个封装 这两个芯片是都焊接吗?不是选择焊接一个吗?两个都是W25XXX的,就是封装不一样而已,估计是大容量和小容量封装。 是不同封装,只焊一个,仔细看了驱动,应该是可以同时有,片选分开。那驱动一开始很让人误解
页:
[1]