Freescale MPC8314 CPU SPI controller driver updated;
来源:互联网 发布:儿童英语产品网络代理 编辑:程序博客网 时间:2024/05/20 02:55
UBOOT自带的驱动最多一次一次向mpc8314 SPI控制器中写入32bit传送, 但一次发送16bit, 24bit MPC8314 SPI控制器有点问题;
索性改成每次都固定8bit的传送,测试通过;
void mpc8xxx_spi_init(void)
{
volatile spi8xxx_t *spi = (spi8xxx_t *)SPI_REG_BASE;
spi->mode = 0;
spi->mask = 0x00000000; /* Mask all SPI interrupts */
spi->com = 0; /* LST bit doesn't do anything, so disregard */
spi->event = 0xffffffff; /* Clear all SPI events */
spi->mode = SPI_MODE_CP_BEGIN_EDGECLK | SPI_MODE_CI_INACTIVEHIGH | SPI_MODE_LEN(7) | SPI_MODE_PM(0xf) | SPI_MODE_REV | SPI_MODE_MS | SPI_MODE_EN;
}
/* 这个函数的重点修改是:每次最多传送8bit, 而不是原始的最多一次传送32bit */
int mpc8xxx_spi_xfer(struct spi_slave *slave, unsigned int bitlen, const unsigned char *dout,
unsigned char *din, unsigned long flags)
{
volatile spi8xxx_t *spi = (spi8xxx_t *)SPI_REG_BASE;
unsigned int tmpdout, tmpdin, event;
int numBlks = bitlen / 8 + (bitlen % 8 ? 1 : 0);
int tm, isRead = 0;
unsigned char charSize = 8;
// poll low CS
spi->event = 0xffffffff; /* Clear all SPI events */
/* handle data in 8-bit chunks */ /* 固定每次都按8bit传送; */
while (numBlks--) {
tmpdout = 0;
charSize = (bitlen >= 8 ? 8 : bitlen);
/* Shift data so it's msb-justified */
tmpdout = *(u8 *)dout;
if (bitlen < 8) {
if (bitlen <= 4)
spi->mode = (spi->mode & 0xff0fffff) |
(3 << 20);
else
spi->mode = (spi->mode & 0xff0fffff) |
((bitlen - 1) << 20);
} else {
spi->mode = (spi->mode & 0xff0fffff) | SPI_MODE_LEN(7);
/* Set up the next iteration if sending > 8 bits */
bitlen -= 8;
dout += 1;
}
spi->tx = tmpdout; /* Write the data out */
/*
* Wait for SPI transmit to get out
* or time out (1 second = 1000 ms)
* The NE event must be read and cleared first
*/
for (tm = 0, isRead = 0; tm < SPI_TIMEOUT; ++tm) {
event = spi->event;
if (event & SPI_EV_NE) {
tmpdin = spi->rx;
spi->event |= SPI_EV_NE;
isRead = 1;
*din = tmpdin & 0xff;
if (charSize == 8) {
din += 1;
}
}
/*
* Only bail when we've had both NE and NF events.
* This will cause timeouts on RO devices, so maybe
* in the future put an arbitrary delay after writing
* the device. Arbitrary delays suck, though...
*/
if (isRead && (event & SPI_EV_NF))
break;
}
if (tm >= SPI_TIMEOUT)
puts("*** spi_xfer: Time out during SPI transfer");
}
return 0;
}
文:董滨华/董兵华/dongbinghua
- Freescale MPC8314 CPU SPI controller driver updated;
- freescale spi driver
- spi driver
- spi master spi driver spi device
- spi master spi driver spi device
- SPI driver test
- Linux SPI FLASH DRIVER
- AD7490 SPI DRIVER
- spi driver framework
- freescale mx6q平台上添加spi资源
- DDR controller driver
- SPI driver for davinci,SPI裸驱,达芬奇
- cpuacct (CPU Accounting Controller)
- FreeScale mpc8xxx + vxWorks平台下spi flash驱动开发三步走
- FreeScale mpc8xxx + vxWorks平台下spi flash驱动开发三步走
- 在freescale mx6q平台上添加spi资源
- 在freescale mx6DL 平台上添加spi资源
- MC251x CAN controller driver example
- Ubuntu 9.10的安装配置和美化
- 下载任意网址图片(所谓任意,不是所有的)
- Windows GUI自动化测试技术的比较和展望 (转)
- 从你选的颜色可以反映出你的性格和心理状态!
- Linux rpm文件安装指南 收藏
- Freescale MPC8314 CPU SPI controller driver updated;
- 关于WM中MFC单文档界面“新建”菜单和关闭按钮的处理
- 不用装飞信软件也发飞信
- 演示对象的生命周期及Session接口
- 演示在应用在使用hibernate实现模型层的开发(手动配置):
- 定义整形变量来接收getchar()返回的值的原因(方便查看转帖)
- CAN入门一
- 数据库连接池使用
- c++学习日记