[Cortex-M0技术交流] 菜鸟学习M0第十七帖——SPI

[复制链接]
 楼主| lixiaoxu2meng 发表于 2011-9-24 11:40 | 显示全部楼层 |阅读模式
本工程实现SPI读写W25Q16BV 工程也参考了 官方的固件库及三心前辈的帖子 声明并表示感谢
main函数
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* */
  3. /* Copyright(c) 2011 Nuvoton Technology Corp. All rights reserved. */
  4. /* */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. #include "includes.h" //包含所需的头文件
  7. /*************************************************************************************
  8. ** Function name: main
  9. ** Descriptions:
  10. ** input parameters: 无
  11. ** output parameters: 无
  12. ** Returned value: 无
  13. *************************************************************************************/
  14. int main (void)
  15. {
  16. uint8_t WriteBuffer[256] = {0};
  17. uint8_t ReadBuffer[256] = {0};
  18. uint16_t i, id = 1;
  19. Set_System(); //封装一些初始化模块
  20. value = 4;
  21. for(i=0;i<256;i++) //初始化数组
  22. {
  23. WriteBuffer[i] = i;
  24. }

  25. SPI_WaitReady(); //W25Q16BV忙状态检查
  26. SPI_SectorErase(0x0000); //扇区擦除
  27. SPI_WaitReady(); //W25Q16BV忙状态检查
  28. SPI_PageProgram(WriteBuffer,0,256); //W25Q16BV按页编程函数

  29. SPI_WaitReady(); //W25Q16BV忙状态检查
  30. SPI_ReadData(ReadBuffer,0,256); //W25Q16BV读数据函数

  31. for(i=0;i<256;i++) //将读出来的数据与写进去的数据进行比较
  32. {
  33. if(WriteBuffer[i] != ReadBuffer[i])
  34. {
  35. id = 0;
  36. break;
  37. }
  38. }

  39. if(id ==1)
  40. value = ReadBuffer[125];
  41. else
  42. value = 88;
  43. while(1)
  44. {
  45. }
  46. }


hw_config函数
  1. #include "includes.h" //包含所需的头文件
  2. #define Enable_SPI_CS DrvGPIO_ClrBit(E_GPA,14)
  3. #define DISABLE_SPI_CS DrvGPIO_SetBit(E_GPA,14)
  4. /*************************************************************************************
  5. ** Function name: Set_System
  6. ** Descriptions: 封装一些初始化模块
  7. ** input parameters: count
  8. ** output parameters: 无
  9. ** Returned value: 无
  10. *************************************************************************************/
  11. void Set_System(void)
  12. {
  13. RCC_Configuration(); //配置系统时钟

  14. GPIO_Configuration(); //配置GPIO

  15. TIMER_Configuration(); //配置TIMER

  16. SPI_Configuration(); //配置SPI1
  17. }
  18. /*************************************************************************************
  19. ** Function name: RCC_Configuration
  20. ** Descriptions: 系统时钟源设置
  21. ** input parameters: none
  22. ** output parameters: none
  23. ** Returned value: none
  24. *************************************************************************************/
  25. void RCC_Configuration(void)
  26. {
  27. UNLOCKREG(); // 对写保护位操作时 需要一次向0x50000 0100写入 0x59,0x16,0x88,
  28. DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);// 与其 SYSCLK->PWRCON.XTL12M_EN = 1; 等同
  29. // PWRCON寄存器(这些寄存器在上电复位到用户解锁定之前是锁定的)除了 BIT[6]位其他位都受写保护
  30. // 解除这些需要向 0x50000 0100写入 0x59,0x16,0x88,
  31. // 令PWRCON寄存器的BITP[0]为1(即设定12M外部晶振)
  32. delay_ms(100); // while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1);//等待外部12MHZ晶振就绪
  33. LOCKREG(); // 向“0x5000_0100”写入任何值,就可以重锁保护寄存器
  34. }
  35. /*************************************************************************************
  36. ** Function name: GPIO_Configuration
  37. ** Descriptions: GPIO配置
  38. ** input parameters: none
  39. ** output parameters: none
  40. ** Returned value: none
  41. *************************************************************************************/
  42. void GPIO_Configuration()
  43. {
  44. //DrvGPIO_Open( E_GPA, 14, E_IO_OUTPUT );//片选

  45. DrvGPIO_Open( E_GPA, 2, E_IO_OUTPUT );//数码管段选
  46. DrvGPIO_Open( E_GPA, 3, E_IO_OUTPUT );
  47. DrvGPIO_Open( E_GPA, 4, E_IO_OUTPUT );
  48. DrvGPIO_Open( E_GPA, 5, E_IO_OUTPUT );
  49. DrvGPIO_Open( E_GPA, 6, E_IO_OUTPUT );
  50. DrvGPIO_Open( E_GPA, 7, E_IO_OUTPUT );
  51. DrvGPIO_Open( E_GPA, 8, E_IO_OUTPUT );
  52. DrvGPIO_Open( E_GPA, 9, E_IO_OUTPUT );
  53. DrvGPIO_Open( E_GPC, 14, E_IO_OUTPUT );//数码管位选
  54. DrvGPIO_Open( E_GPC, 15, E_IO_OUTPUT );
  55. DrvGPIO_Open( E_GPC, 6, E_IO_OUTPUT );
  56. DrvGPIO_Open( E_GPC, 7, E_IO_OUTPUT );
  57. }
  58. /*************************************************************************************
  59. ** Function name: TIMER_Configuration
  60. ** Descriptions: TIMER配置
  61. ** input parameters: none
  62. ** output parameters: none
  63. ** Returned value: none
  64. *************************************************************************************/
  65. void TIMER_Configuration()
  66. {
  67. DrvTIMER_Init(); //初始化定时器

  68. DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC,0); //使用外设时注意必须设置该外设的时钟 设置TIMER0的时钟源为外部12MHZ

  69. DrvTIMER_Open(E_TMR0,1000,E_PERIODIC_MODE); //设定定时器timer0的tick周期,并且启动定时器:定时器通道 TMR0 每秒1000次 周期模式

  70. DrvTIMER_SetTimerEvent(E_TMR0,5,(TIMER_CALLBACK) Timer0_Callback,0); //安装一个定时处理事件到 timer0通道

  71. DrvTIMER_EnableInt(E_TMR0); //使能定时器中断 //TIMER0->TCSR.IE = 1

  72. DrvTIMER_Start(E_TMR0); //定时器timer0开始计数 //TIMER0->TCSR.CEN = 1;
  73. }
  74. /*************************************************************************************
  75. ** Function name: Timer0_Callback
  76. ** Descriptions: 定时处理事件,LED动态扫描
  77. ** input parameters: none
  78. ** output parameters: none
  79. ** Returned value: none
  80. *************************************************************************************/
  81. void Timer0_Callback (void)
  82. {
  83. static uint8_t count= 0;
  84. static uint8_t i,xx[4];
  85. uint32_t data;
  86. uint16_t ValueBuff ;
  87. ValueBuff = value;
  88. count++;
  89. if(count >= 5)
  90. count = 1;
  91. for(i=0;i<4;i++)
  92. {
  93. xx[i] = ValueBuff%10;
  94. ValueBuff = ValueBuff/10;
  95. }
  96. switch(count)
  97. {
  98. case 1:
  99. DrvGPIO_SetBit(E_GPC,14);
  100. DrvGPIO_ClrBit(E_GPC,15);
  101. DrvGPIO_ClrBit(E_GPC,6);
  102. DrvGPIO_ClrBit(E_GPC,7);
  103. data = Table[xx[0]]<<2;
  104. GPIOA->DOUT = data;
  105. break;
  106. case 2:
  107. DrvGPIO_SetBit(E_GPC,15);
  108. DrvGPIO_ClrBit(E_GPC,14);
  109. DrvGPIO_ClrBit(E_GPC,6);
  110. DrvGPIO_ClrBit(E_GPC,7);
  111. data = Table[xx[1]]<<2;
  112. GPIOA->DOUT = data;
  113. break;
  114. case 3:
  115. DrvGPIO_SetBit(E_GPC,7);
  116. DrvGPIO_ClrBit(E_GPC,14);
  117. DrvGPIO_ClrBit(E_GPC,15);
  118. DrvGPIO_ClrBit(E_GPC,6);
  119. data = Table[xx[2]]<<2;
  120. GPIOA->DOUT = data;
  121. break;
  122. case 4:
  123. DrvGPIO_SetBit(E_GPC,6);
  124. DrvGPIO_ClrBit(E_GPC,14);
  125. DrvGPIO_ClrBit(E_GPC,15);
  126. DrvGPIO_ClrBit(E_GPC,7);
  127. data = Table[xx[3]]<<2;
  128. GPIOA->DOUT = data;
  129. //DrvGPIO_ClrBit(E_GPA,9); //显示小数点
  130. break;
  131. default:break;
  132. }
  133. }
  134. /*************************************************************************************
  135. ** Function name: SPI_Configuration
  136. ** Descriptions: SPI配置
  137. ** input parameters: none
  138. ** output parameters: none
  139. ** Returned value: none
  140. *************************************************************************************/
  141. void SPI_Configuration()
  142. {
  143. //此功能是用来打开SPI模块。它决定了SPI工作在主或从模式,SPI总线时序 和每传输比特长度
  144. //指定SPI端口为SPI1 并配置SPI1为主模式 TYPE1总线时序(时钟的空闲状态为低;在串行时钟的下降沿驱动器的数据,在串行时钟上升沿锁存数据) 32位传输
  145. DrvSPI_Open(eDRVSPI_PORT1, eDRVSPI_MASTER, eDRVSPI_TYPE1, 32,FALSE);

  146. DrvSPI_SetEndian(eDRVSPI_PORT1, eDRVSPI_MSB_FIRST); //配置SPI1传输比特的顺序:优先发送/接收MSB
  147. DrvSPI_DisableAutoSS(eDRVSPI_PORT1); //禁止自动片选功能
  148. DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT1, eDRVSPI_ACTIVE_LOW_FALLING); //设定从选择线的激活级别:低电平或者下降沿
  149. DrvSPI_Set2BitTransferMode(eDRVSPI_PORT1, TRUE); //设置2比特串行数据I/O 模式
  150. DrvSPI_SetClockFreq(eDRVSPI_PORT1, 1000000, 0); //设置SPI的时钟频率为1MHz

  151. DrvGPIO_Open(E_GPA,14, E_IO_OUTPUT); //SPI_FLAH_CS引脚(即GPA14)为输出
  152. DISABLE_SPI_CS; //输出低电平 即禁止W25Q16BV 的片选信号

  153. }
  154. /*************************************************************************************
  155. ** Function name: SPI_ReadMidDid
  156. ** Descriptions: W25Q16BV读制造商ID及设备ID函数
  157. ** input parameters: none
  158. ** output parameters: none
  159. ** Returned value: none
  160. *************************************************************************************/
  161. uint32_t SPI_ReadMidDid(void)
  162. {
  163. uint32_t au32SourceData;
  164. uint32_t au32DestinationData;

  165. DrvSPI_SetBitLength(eDRVSPI_PORT1, 8); //配置SPI传输的比特长度:8 bits
  166. Enable_SPI_CS; //使能W25Q16BV 的片选信号
  167. au32SourceData = 0x90; // send Command: 0x90, Read Manufacturer/Device ID
  168. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送命令到 SPI 总线
  169. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲

  170. DrvSPI_SetBitLength(eDRVSPI_PORT1, 24); //配置SPI传输的比特长度:24 bits
  171. au32SourceData = 0x0;
  172. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送数据到 SPI 总线: 0x00 (24-bit Address)
  173. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲

  174. DrvSPI_SetBitLength(eDRVSPI_PORT1, 16); //配置SPI传输的比特长度:16 bits
  175. au32SourceData = 0x0;
  176. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //接收数据
  177. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲

  178. DISABLE_SPI_CS; // 禁止W25Q16BV 的片选信号
  179. DrvSPI_DumpRxRegister(eDRVSPI_PORT1, &au32DestinationData, 1); //从RX寄存器中读取数据 此功能将不会触发SPI数据传输
  180. return (au32DestinationData & 0xffff); //返回MidDid
  181. }
  182. /*************************************************************************************
  183. ** Function name: SPI_ReadStatusReg1
  184. ** Descriptions: W25Q16BV读状态寄存器1函数
  185. ** input parameters: none
  186. ** output parameters: none
  187. ** Returned value: none
  188. *************************************************************************************/
  189. uint32_t SPI_ReadStatusReg1(void)
  190. {
  191. uint32_t au32SourceData;
  192. uint32_t au32DestinationData;

  193. DrvSPI_SetBitLength(eDRVSPI_PORT1, 16); //配置SPI传输的比特长度:16 bits
  194. Enable_SPI_CS; //使能W25Q16BV 的片选信号
  195. au32SourceData = 0x0500; //send Command: 0x05, Read status register 1
  196. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送数据到 SPI 总线: 0x0500 (Read status register 1)
  197. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲
  198. DISABLE_SPI_CS; //禁止W25Q16BV 的片选信号
  199. DrvSPI_DumpRxRegister(eDRVSPI_PORT1, &au32DestinationData, 1); //从RX寄存器中读取数据 此功能将不会触发SPI数据传输
  200. return (au32DestinationData & 0xFF);
  201. }
  202. /*************************************************************************************
  203. ** Function name: SPI_WaitReady
  204. ** Descriptions: W25Q16BV忙状态检查函数
  205. ** input parameters: none
  206. ** output parameters: none
  207. ** Returned value: none
  208. *************************************************************************************/
  209. void SPI_WaitReady(void)
  210. {
  211. uint32_t ReturnValue;

  212. do{
  213. ReturnValue = SPI_ReadStatusReg1();
  214. ReturnValue = ReturnValue & 1;
  215. }while(ReturnValue!=0); //检查从设备状态寄存器1的BUSY位 等待其为0
  216. }

  217. /*************************************************************************************
  218. ** Function name: SPI_ChipErase
  219. ** Descriptions: W25Q16BV片擦除函数
  220. ** input parameters: none
  221. ** output parameters: none
  222. ** Returned value: none
  223. *************************************************************************************/
  224. void SPI_ChipErase(void)
  225. {
  226. uint32_t au32SourceData;

  227. DrvSPI_SetBitLength(eDRVSPI_PORT1, 8); //配置SPI传输的比特长度:8 bits
  228. Enable_SPI_CS; //使能W25Q16BV 的片选信号
  229. au32SourceData = 0x06;
  230. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送数据到 SPI 总线: 0x06 (Write enable)
  231. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲
  232. DISABLE_SPI_CS; //禁止W25Q16BV 的片选信号
  233. Enable_SPI_CS; //使能W25Q16BV 的片选信号
  234. au32SourceData = 0xC7; // send Command: 0xC7, Chip Erase
  235. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送数据到 SPI 总线: 0xC7 (Chip Erase)
  236. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲
  237. DISABLE_SPI_CS; //禁止W25Q16BV 的片选信号
  238. }
  239. /*************************************************************************************
  240. ** Function name: SPI_ReadData
  241. ** Descriptions: W25Q16BV读数据函数
  242. ** input parameters: DataBuffer0,StartAddressByteCount
  243. ** output parameters: none
  244. ** Returned value: none
  245. *************************************************************************************/
  246. void SPI_ReadData(uint8_t *DataBuffer, uint32_t StartAddress, uint32_t ByteCount)
  247. {
  248. uint32_t au32SourceData;
  249. uint32_t au32DestinationData;
  250. uint32_t Counter;

  251. DrvSPI_SetBitLength(eDRVSPI_PORT1, 8); //配置SPI传输的比特长度:8 bits
  252. Enable_SPI_CS; //使能W25Q16BV 的片选信号
  253. au32SourceData = 0x03;
  254. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送数据到 SPI 总线: 0x03 (Read data)
  255. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲
  256. DrvSPI_SetBitLength(eDRVSPI_PORT1, 24); //配置SPI传输的比特长度:24 bits
  257. au32SourceData = StartAddress;
  258. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送数据到 SPI 总线: StartAddress
  259. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲
  260. DrvSPI_SetBitLength(eDRVSPI_PORT1, 8); //配置SPI传输的比特长度:8 bits
  261. for(Counter=0; Counter<ByteCount; Counter++)
  262. {
  263. au32SourceData = 0x0;
  264. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //接收数据;
  265. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲
  266. DrvSPI_DumpRxRegister(eDRVSPI_PORT1, &au32DestinationData, 1);//从RX寄存器中读取数据 此功能将不会触发SPI数据传输
  267. DataBuffer[Counter] = (uint8_t) au32DestinationData;
  268. }
  269. DISABLE_SPI_CS; //禁止W25Q16BV 的片选信号
  270. }

  271. /*************************************************************************************
  272. ** Function name: SPI_PageProgram
  273. ** Descriptions: W25Q16BV按页编程函数
  274. ** input parameters: none
  275. ** output parameters: none
  276. ** Returned value: none
  277. *************************************************************************************/
  278. void SPI_PageProgram(uint8_t *DataBuffer, uint32_t StartAddress, uint32_t ByteCount)
  279. {
  280. uint32_t au32SourceData;
  281. uint32_t Counter;

  282. DrvSPI_SetBitLength(eDRVSPI_PORT1, 8); //配置SPI传输的比特长度:8 bits
  283. Enable_SPI_CS; //使能W25Q16BV 的片选信号
  284. au32SourceData = 0x06; // send Command: 0x06, Write enable
  285. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送数据到 SPI 总线: 0x06 (Write enable)
  286. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲
  287. DISABLE_SPI_CS; //禁止W25Q16BV 的片选信号
  288. Enable_SPI_CS; //使能W25Q16BV 的片选信号
  289. au32SourceData = 0x02;
  290. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送数据到 SPI 总线: 0x02 (Page program)
  291. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲
  292. DrvSPI_SetBitLength(eDRVSPI_PORT1, 24); //配置SPI传输的比特长度:24 bits
  293. au32SourceData = StartAddress;
  294. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送数据到 SPI 总线: StartAddress
  295. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲
  296. DrvSPI_SetBitLength(eDRVSPI_PORT1, 8); //配置SPI传输的比特长度:8 bits
  297. for(Counter=0; Counter<ByteCount; Counter++)
  298. {
  299. au32SourceData = DataBuffer[Counter];
  300. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送数据到 SPI 总线
  301. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲
  302. }
  303. DISABLE_SPI_CS; //禁止W25Q16BV 的片选信号
  304. }
  305. /*************************************************************************************
  306. ** Function name: SPI_SectorErase
  307. ** Descriptions: W25Q16BV扇区擦除函数
  308. ** input parameters: none
  309. ** output parameters: none
  310. ** Returned value: none
  311. *************************************************************************************/
  312. void SPI_SectorErase(uint32_t StartAddress)
  313. {

  314. uint32_t au32SourceData;
  315. DrvSPI_SetBitLength(eDRVSPI_PORT1, 8); //配置SPI传输的比特长度:8 bits
  316. Enable_SPI_CS; //使能W25Q16BV 的片选信号
  317. au32SourceData = 0x06;
  318. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送数据到 SPI 总线: 0x06 (Write enable)
  319. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲
  320. DISABLE_SPI_CS; //禁止W25Q16BV 的片选信号
  321. DrvSPI_SetBitLength(eDRVSPI_PORT1, 8); //配置SPI传输的比特长度:8 bits
  322. Enable_SPI_CS; //使能W25Q16BV 的片选信号
  323. au32SourceData = 0x20;
  324. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送数据到 SPI 总线: 0x20 (Sector Erase)
  325. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲
  326. DrvSPI_SetBitLength(eDRVSPI_PORT1, 24); //配置SPI传输的比特长度:24 bits
  327. au32SourceData = StartAddress&0xFFF000;
  328. DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); //发送数据到 SPI 总线: StartAddress
  329. while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {} //等待SPI端口空闲
  330. DISABLE_SPI_CS; //禁止W25Q16BV 的片选信号

  331. }
  332. /*************************************************************************************
  333. ** Function name: delay_ms
  334. ** Descriptions: 1ms(晶振为12MHZ)延时子程序
  335. ** input parameters: count
  336. ** output parameters: 无
  337. ** Returned value: 无
  338. *************************************************************************************/
  339. void delay_ms(uint32_t count)
  340. {
  341. uint32_t i,j;
  342. for(i=count;i>0;i--)
  343. for(j=2395;j>0;j--);
  344. }

hw_config头文件
  1. #ifndef __HW_CONFIG_H__
  2. #define __HW_CONFIG_H__
  3. void Set_System(void);
  4. void RCC_Configuration(void);
  5. void GPIO_Configuration(void);
  6. void TIMER_Configuration(void);
  7. void Timer0_Callback (void);
  8. void SPI_Configuration(void);
  9. uint32_t SPI_ReadMidDid(void);
  10. uint32_t SPI_ReadStatusReg1(void);
  11. void SPI_WaitReady(void);
  12. void SPI_ChipErase(void);
  13. void SPI_ReadData(uint8_t *DataBuffer0, uint32_t StartAddress, uint32_t ByteCount);
  14. void SPI_PageProgram(uint8_t *DataBuffer, uint32_t StartAddress, uint32_t ByteCount);
  15. void SPI_SectorErase(uint32_t StartAddress);
  16. void delay_ms(uint32_t count);
  17. #endif

已测试通过 OK
工程
芯片资料

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
老鱼探戈 发表于 2011-9-26 21:25 | 显示全部楼层
顶!
hotpower 发表于 2011-9-26 22:03 | 显示全部楼层
加PDMA才好玩~~~
yongjun_meng 发表于 2012-6-28 14:28 | 显示全部楼层
顶起
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1679

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部