本帖最后由 effx 于 2010-12-21 10:23 编辑
大家好。我先想AT24C02里写8个字符,然后DMA读出来,再把读出来的数据发到超级终端看是否正确。我发的字符时‘1’,‘2’,......,'8',但超级终端显示的只有'1',其他都是空格。程序写得很烂,大家不要笑话。写AT24C02是没问题的,因为开始我没用DMA接收,结果是正确的。
void DMA_Config(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel7);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)I2C1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)rx_data;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 8;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel7, &DMA_InitStructure);
}
省掉不相关的。。。。。。
{
/*Master Transfer Start*/
I2C1->CR1 |= 1<<8;
/*Wait until SB be set*/
while(((I2C1->SR1)&(1)) == 0);
I2C1->DR = 0xA0;
/*Wait until ADDR be set*/
while(((I2C1->SR1)&(1<<1)) == 0);
/*Read SR1*/
temp_read = I2C1->SR1 ;
/*Read SR2*/
temp_read = I2C1->SR2;
I2C1->DR = 0;
/*Wait until BTF be set*/
while(((I2C1->SR1)&(1<<2)) == 0);
I2C1->DR = '1';
/*Wait until BTF be set*/
while(((I2C1->SR1)&(1<<2)) == 0);
I2C1->DR = '2';
/*Wait until BTF be set*/
while(((I2C1->SR1)&(1<<2)) == 0);
/*Wait until BTF be set*/
I2C1->DR = '3';
/*Wait until BTF be set*/
while(((I2C1->SR1)&(1<<2)) == 0);
I2C1->DR = '4';
/*Wait until BTF be set*/
while(((I2C1->SR1)&(1<<2)) == 0);
I2C1->DR = '5';
/*Wait until BTF be set*/
while(((I2C1->SR1)&(1<<2)) == 0);
I2C1->DR = '6';
/*Wait until BTF be set*/
while(((I2C1->SR1)&(1<<2)) == 0);
I2C1->DR = '7';
/*Wait BTF be set*/
while(((I2C1->SR1)&(1<<2)) == 0);
I2C1->DR = '8';
/*Wait until BTF be set*/
while(((I2C1->SR1)&(1<<2)) == 0);
/*I2C Stop*/
I2C1->CR1 |= 1<<9;
/*Wait until Stop be cleard*/
while(((I2C1->CR1)&(1<<9)) == 1);
/*延时等待EEPROM的内部写操作完成*/
Delay(0xfffff);
Delay(0xfffff);
Delay(0x5ffff);
Delay(0xfffff);
Delay(0xfffff);
Delay(0x5ffff);
/*24C02 Dummy Write*/
/*I2C Start*/
I2C1->CR1 |= 1<<8;
/*Wait until SB be set*/
while(((I2C1->SR1)&(1)) == 0);
I2C1->DR = 0xA0;
/*Wait until ADDR be set*/
while(((I2C1->SR1)&(1<<1)) == 0);
/*Read SR1*/
temp_read = I2C1->SR1;
/*Read SR2*/
temp_read = I2C1->SR2;
I2C1->DR = 0;
/*Wait until BTF be set*/
while(((I2C1->SR1)&(1<<2)) == 0);
DMA_Config();
/* Enable DMA1 Channel7 */
DMA_Cmd(DMA1_Channel7, ENABLE);
/* Set Last bit to have a NACK on the last received byte */
I2C1->CR2 |= (1<<12);
/* Enable I2C DMA requests */
I2C1->CR2 |= (1<<11);
/*读24C02*/
/*I2C Start*/
I2C1->CR1 |= 1<<8;
/*Wait until SB be set*/
while(((I2C1->SR1)&(1)) == 0 );
I2C1->DR = 0xA1;
/*Wait until ADDR be set*/
while(((I2C1->SR1)&(1<<1)) == 0 );
/*Read SR1*/
temp_read = I2C1->SR1 ;
/*Read SR2*/
temp_read = I2C1->SR2;
while(((DMA1->ISR)&(1<<25)) == 0);
DMA1_Channel7->CCR &= ~(1);
DMA1->IFCR |= 1<<25;
/*Set STOP*/
I2C1->CR1 |= (1<<9);
while(((I2C1->CR1)&(1<<9)) == (1<<9));
USART_TX_Byte(rx_data[0]);
USART_TX_Byte(rx_data[1]);
USART_TX_Byte(rx_data[2]);
USART_TX_Byte(rx_data[3]);
USART_TX_Byte(rx_data[4]);
USART_TX_Byte(rx_data[5]);
USART_TX_Byte(rx_data[6]);
USART_TX_Byte(rx_data[7]);
} |