在使用BF512 的TWI进行读取数据时,根据官方给定的汇编代码,改写成C语言代码;但是改编的C语言代码,在测试过程中,并没有读取到数值出来,烦请版主,在空闲的时候,帮助看一下,发现问题,望及时指正,谢谢,下述C代码,是我从官方用户手册的汇编代码改写而来:
int twi_init(void)
{
*pTWI_CONTROL = TWI_ENA | 0x000a;
*pTWI_CLKDIV = 0x2044; // CLKHI(0x20) | CLKLOW(0x44)
return 0;
}
int twi_write_data(int *buf) //写一个字节数据
{
int tmp = 0, stat_tmp = 0;
*pMASTER_ADDR = 0x6a; //0x6a为TWI所要读取的MAX11617(ADC模块)的地址
tmp = 1; //写八位数据
tmp <<= 6;
tmp |= 1; //MEN
*pMASTER_CTL = tmp;
*pTWI_XMT_DATA8 = *buf;
do
{
stat_tmp = *pTWI_INT_STAT;
}
while((stat_tmp & XMTSERV) != XMTSERV);
*pTWI_INT_STAT |= stat_tmp; //循环判断发送缓存队列的状态
return 0;
}
void twi_read_adc_value(unsigned char adc_address, int *adc_buf_value, int adc_buf_length)
{
int temp = 0;
int fifo_stat_value = 0;
int int_stat_value = 0;
adc_address = (adc_address >> 1);
*pTWI_MASTER_ADDR = adc_address; //从机地址 adc_address = 0x6a
temp = adc_buf_length; //数据长度 adc_buf_length = 2
temp = (temp << 6);
temp = (temp | MDIR); //MDIR
temp = (temp | MEN); //MEN
*pTWI_MASTER_CTL = temp;
do
{
fifo_stat_value = *pTWI_FIFO_STAT;
fifo_stat_value = (fifo_stat_value & 0xc);
} while(fifo_stat_value != 0xc); //循环判断接收缓存,是否已满
*adc_buf_value = *pTWI_RCV_DATA16;
do
{
int_stat_value = *pTWI_INT_STAT;
} while((*pTWI_INT_STAT & MCOMP) != MCOMP); //循环判断,接收过程,是否已经完成
*pTWI_INT_STAT = int_stat_value;
}
下述三个函数,为主函数中依次调用的函数:
twi_init();
twi_write_data(&send_buf);
twi_read_adc_value(0x6a, &adc_receive_value, 2);
调用结束后,在adc_receive_value中,并未获取到任何值;还望楼主指正,接收函数twi_read_adc_value(unsigned char adc_address, int *adc_buf_value, int adc_buf_length);哪里改编有误,不胜感激。