在读ds1339c中的数据之前,先向ds1339c中写入一个初始时间,调用TWI_MasterMode_Write读函数,这个从示波器上看是没有问题的。但是TWI_MasterMode_Read操作时出现问题:
1.当参数unsigned short Count的值大于2的时候(Count为要读的数据字节的个数,采用八位二进制表示的),没有数据读出,
2.当红色字体的语句注释掉之后,且unsigned short Count的值不大于2时,有数据读出,但是红色字体的语句为判断FIFO缓存器中是否有数据,正常的操作过程就是先判断FIFO中有数据,然后才能读出数据,但在这里却要去掉才行。
3.当这个TWI_MasterMode_Read函数放在循环中时,第九次循环才有数据读出,之前都是0.
void TWI_MasterMode_Read(unsigned short DeviceAddr, unsigned char *TWI_Data_Pointer, unsigned short Count)
{
int i, j;
*pTWI_FIFO_CTL = 0; /* clear the bit manually */
*pTWI_CONTROL = TWI_ENA | PRESCALE_VALUE; /* PRESCALE = fsclk/10MHz */
*pTWI_CLKDIV = ((CLKDIV_HI) << 8) | (CLKDIV_LO); /* CLKDIV = (1/SCL)/(1/10MHz) */
*pTWI_MASTER_ADDR = DeviceAddr; /* target address (7-bits plus the read/write bit) */
*pTWI_MASTER_CTL = (Count<<6) | MEN | MDIR /*| FAST*/; /* start transmission */
/* for each item */
for (i = 0; i < Count; i++)
{
while (*pTWI_FIFO_STAT == RCV_EMPTY) /* wait for data to be in FIFO */
ssync();
*TWI_Data_Pointer++ = *pTWI_RCV_DATA8; /* read the data */
ssync();
}
while ((*pTWI_INT_STAT & MCOMP) == 0) /* wait until transmission complete and MCOMP is set */
ssync();
*pTWI_INT_STAT = RCVSERV | MCOMP; /* service TWI for next transmission */
// asm("nop;");
// asm("nop;");
// asm("nop;");
}