|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
我在写一个wince的spi驱动来读取ad的数值,
使用查询方式读取2440 spi总线上的数据
void write_spi(unsigned char txdata)
{
// Check the status of Transfer Ready flag(READY=1) ,and then write data to SPTDAT0
v_pSPIPregs->SPTDAT0 = txdata; // Write Potentiometer value
RETAILMSG(TRUE, (TEXT("INFO:write_spi data (%ld).\r\n"), v_pSPIPregs->SPTDAT0));
RETAILMSG(TRUE, (TEXT("INFO:before while loop v_pSPIPregs->SPSTA0 is (%ld).\r\n"), v_pSPIPregs->SPSTA0));
// Wait to complete write data
while(!(v_pSPIPregs->SPSTA0 & 0x01== 0x01 )); //SPSTA0的READY是否置位
RETAILMSG(1,(TEXT("write_spi delay is over\n")));
}
每次调试到上述代码中的while(!(v_pSPIPregs->SPSTA0 & 0x01== 0x01 )); 时,cpu就不停地执行该循环,不再继续执行。
我开始怀疑是2440的时钟有问题 我写了
RETAILMSG(TRUE, (TEXT("INFO:before write data v_pSPIPregs->SPSTA0 is (%ld).\r\n"), v_pSPIPregs->SPSTA0));
v_pSPIPregs->SPTDAT0 = txdata;
RETAILMSG(TRUE, (TEXT("INFO:write_spi data (%ld).\r\n"), v_pSPIPregs->SPTDAT0));
RETAILMSG(TRUE, (TEXT("INFO:after write data v_pSPIPregs->SPSTA0 is (%ld).\r\n"), v_pSPIPregs->SPSTA0));
结果打印显示该标志位一直为0 也就是繁忙 所以后面的while循环当中 该标志位一直为繁忙 所以不停地打印语句 也就是说 往里面的写入的数据都没有发送出去 有可能是时钟的问题 可是我设置了时钟使能
s2440SPIPWR->CLKCON |= SPI_POWER_ON;// SPI clock enable
时钟频率为:
// Baudrate = PCLK/2/(Prescaler value + 1)
// PCLK = 400M/6 = 66.7MHz
// Prescaler value = 0x22= 34
// Baudrate = 66.7MHz/2/(34 + 1) = 0.95MHz
v_pSPIPregs->SPPRE0 = 0x22;
这究竟是什么导致了该标志位一直为繁忙状态呢。。。是不是没有时钟 导致写入的数据都无法发送出去呢? |
|