SCCB协议

1.SCCB协议介绍

SCCB(Serial Camera Control Bus ),为串行相机控制总线。与I2C协议极为类似。
SCCB 的起始信号、停止信号及数据有效性与 I2C 完全一样。
1.起始信号: 在 SCL(图中为 SIO_C) 为高电平时, SDA(图中为 SIO_D)出现一个下降沿,则 SCCB 开始传输。
2.停止信号:在 SCL 为高电平时, SDA 出现一个上升沿,则 SCCB 停止传输。
3.数据有效性:除了开始和停止状态, 在数据传输过程中,当 SCL 为高电平时,
必须保证 SDA 上的数据稳定,也就是说, SDA 上的电平变换只能发生在 SCL 为低电平的时候,SDA 的信号在 SCL 为高电平时被采集。
在这里插入图片描述

2.SCCB读写过程

在这里插入图片描述
写过程:起始信号+设备地址写+不关心+寄存器地址+不关心+写数据+不关心+停止位。
ID ADDRESS和I2C一样由七位地址线加一位读写位组成,X表示不关心。
在这里插入图片描述
读过程:起始信号+设备地址写+不关心+寄存器地址+不关心+停止信号+起始信号+设备地址写+不关心+读数据+未应答+停止位。

3.SCCB与I2C区别

1.应答位:I2C应答位为ACK(0为有应答,1为无应答)。而SCCB中应答位位X,表示don’t care。
2.I2C中部分设备支持页操作,而SCCB中不支持页操作
3.SCCB读操作中虚写后有stop信号,而I2C中可有可无。

4.SCCB编写时序

在这里插入图片描述

// FPGA   : 小梅哥AC620
// EDA 	  : Quartus II 13.0sp1 (64-bit) and ModelSim SE-64 10.5 
// Author : FPGA小白758 https://blog.csdn.net/q1594?spm=1010.2135.3001.5343
// File   : SCCB_CTRL.v
// Create : 2022-05-13 19:23:53
// Revise : 2022-05-13 19:24:14
// Editor : sublime text3, tab size (4)
// -----------------------------------------------------------------------------
module SCCB_CTRL
#(
    parameter   CLK_FREQ   		= 	26'd50_000_000, 	//模块输入的时钟频率
    parameter   SCCB_FREQ   	= 	18'd250_000     	//IIC_SCL的时钟频率
)
(
	input	wire				clk 						,	//系统时钟
	input	wire				rst_n 						,	//复位信号
	input	wire				sccb_exec 					,	//sccb协议传输开始
	input	wire				bit_ctrl 					,	//地址位控制
	input	wire				sccb_rh_wl 					,	//读写控制
	input	wire	[15:0]		sccb_addr 					,	//寄存器地址
	input	wire	[ 7:0]		sccb_data_wr 				,	//写数据
	input	wire	[ 6:0]		SLAVE_ADDR 					,	//从机地址

	output	reg 	[ 7:0]		sccb_data_rd 				,	//读数据
	output	reg 				sccb_done 					,	//sccb协议传输完成
	output	reg					sccb_clk 					,	//sccb模块的工作时钟
	output	reg	 				sio_c 						,	//sccb协议传输时钟
	inout	wire 				sio_d 							//sccb协议数据线
);

parameter CLK_DIVIDE_MAX = (CLK_FREQ / SCCB_FREQ) >> (1'b1 + 2'd2) - 1'b1;	//(SCCB协议的四分频计数最大值)

parameter	st_idle			=		8'b0000_0001			;	//初始状态
parameter	st_addr_wr		=		8'b0000_0010 			;	//设备地址写
parameter	st_addr_16		=		8'b0000_0100 			;	//寄存器地址高八位写入
parameter	st_addr_8 		=		8'b0000_1000 			;	//寄存器地址低八位写入
parameter 	st_data_wr		=		8'b0001_0000			;	//写数据传输
parameter	st_addr_rd 		=		8'b0010_0000 			;	//设备地址读
parameter	st_data_rd 		=		8'b0100_0000 			;	//读数据传输
parameter	st_stop			=		8'b1000_0000 			;	//一次通讯结束

reg		[ 7:0]		cur_state								;	//状态机当前状态
reg		[ 7:0]		next_state								;	//状态机下一状态
reg					st_done									;	//状态完成(数据发送完成)
reg		[ 8:0]		clk_divide								;	//模块驱动时钟的分频系数
reg 				sccb_rh_wl_reg 							; 	//寄存读写状态
reg 	[ 7:0]		cnt 									; 	//sccb_clk 计数
reg 				bit_ctrl_reg 							;	//地址位控制寄存
reg 	[15:0]		sccb_addr_reg 							;	//寄存器地址寄存
reg 	[ 7:0]		sccb_data_wr_reg						;	//写数据寄存
reg 	[ 7:0]		SLAVE_ADDR_reg 							;	//从机设备地址寄存

reg 				sio_d_dir 								;	//sio输入输出控制 高输出,低输入
reg					sio_d_out								;	//sio_d输出信号
wire				sio_d_in 								;	//sio_d输入信号



parameter CLK_DIVIDE = (CLK_FREQ / SCCB_FREQ) >> (1'b1 + 2'd2)	;	//(SCCB协议的四分频)

//三态们输出
assign sio_d = (sio_d_dir == 1'b1) ? sio_d_out : 'dz;
assign sio_d_in = sio_d;

//模块驱动时钟计数器
always @(posedge clk or negedge rst_n) begin
	if (rst_n == 1'b0) begin
		// reset
		clk_divide <= 'd0;
	end
	else if (clk_divide == CLK_DIVIDE_MAX) begin
		clk_divide <= 'd0;
	end
	else begin
		clk_divide <= clk_divide + 1'b1;
	end
end

//模块驱动时钟
always @(posedge clk or negedge rst_n) begin
	if (rst_n == 1'b0) begin
		// reset
		sccb_clk <= 1'b0;
	end
	else if(clk_divide == CLK_DIVIDE_MAX) begin
		sccb_clk <= ~sccb_clk;
	end
end

//三段式状态机,同步时序描述状态转移
always @(posedge sccb_clk or negedge rst_n) begin
	if (rst_n == 1'b0) begin
		// reset
		cur_state <= st_idle;
	end
	else begin
		cur_state <= next_state;
	end
end

//组合逻辑判断状态转移条件
always @(*) begin
	next_state = st_idle;
	case(cur_state)
		st_idle		:	begin 			//初始状态,当传输开始时状态跳转
			if(sccb_exec == 1'b1)begin
				next_state = st_addr_wr;
			end
			else begin
				next_state = st_idle;
			end
		end
		st_addr_wr	:	begin 				//发送设备地址加读
			if(st_done == 1'b1)begin
				if (bit_ctrl == 1'b1)begin
					next_state = st_addr_16;
				end
				else begin
					next_state = st_addr_8;
				end
			end
			else begin
				next_state = st_addr_wr;
			end
		end
		st_addr_16	:	begin 				//发送寄存器地址高八位
			if(st_done == 1'b1)begin
				next_state = st_addr_8;
			end
			else begin
				next_state = st_addr_16;
			end
		end
		st_addr_8 	:	begin 				//发送寄存器地址低八位
			if(st_done == 1'b1)begin
				if(sccb_rh_wl_reg == 1'b0)begin  //写状态
					next_state = st_data_wr;
				end
				else begin
				 	next_state = st_data_rd; 	//读状态
				 end 
			end
			else begin
				next_state = st_addr_8; 		//未完成,保持
			end
		end
		st_data_wr 	:	begin
			if(st_done == 1'b1)begin
				next_state = st_stop;
			end
			else begin
				next_state = st_data_wr;
			end
		end
		st_data_rd 	:	begin
			if(st_done == 1'b1)begin
				next_state = st_data_rd;
			end
			else begin
				next_state = st_data_rd;
			end
		end
		st_data_rd 	:	begin
			if(st_done == 1'b1)begin
				next_state = st_stop;
			end
			else begin
				next_state = st_data_rd;
			end
		end
		st_stop 	:	begin
			if(st_done == 1'b1)begin
				next_state = st_idle;
			end
			else begin
				next_state = st_stop;
			end
		end
		default 	:	next_state = st_idle;
	endcase
end

//时序电路描述状态输出
always @(posedge sccb_clk or negedge rst_n) begin
	if (rst_n == 1'b0) begin
		// reset
		cnt 				<= 	'd0 			;	//传输寄存器
		st_done 			<=	'd0 			;	//传输完成标志位
		sio_c 				<= 	'd1				;	//sio时钟线
		sio_d_out 			<= 	'd1 			; 	//sio_d输出
		sio_d_dir 			<=	'd1 			;	//sio_d输入输出判断
	
		bit_ctrl_reg 		<=	bit_ctrl 		; 	//寄存器地址位寄存
		sccb_rh_wl_reg 		<=	sccb_rh_wl 		; 	//读写标志寄存
		sccb_addr_reg 		<= 	sccb_addr 		; 	//寄存器地址寄存
		sccb_data_wr_reg	<=	sccb_data_wr 	; 	//写数据寄存
		SLAVE_ADDR_reg 		<=  SLAVE_ADDR 		; 	//从机地址寄存
	end
	else  begin
		st_done <= 1'b0;
		cnt <=	cnt + 1'b1;
		case(cur_state)
		st_idle 	:	begin
			cnt 				<= 	'd0 			;	//传输寄存器
			st_done 			<=	'd0 			;	//传输完成标志位
			sio_c 				<= 	'd1				;	//sio时钟线,默认高电平
			sio_d_out 			<= 	'd1 			; 	//sio_d输出,默认高电平
			sio_d_dir 			<=	'd1 			;	//sio_d输入输出判断
			sccb_done			<=	'd0;
			if(sccb_exec == 1'b1)begin
				bit_ctrl_reg 		<=	bit_ctrl 		; 	//寄存器地址位寄存
				sccb_rh_wl_reg 		<=	sccb_rh_wl 		; 	//读写标志寄存
				sccb_addr_reg 		<= 	sccb_addr 		; 	//寄存器地址寄存
				sccb_data_wr_reg	<=	sccb_data_wr 	; 	//写数据寄存
				SLAVE_ADDR_reg 		<=  SLAVE_ADDR 		; 	//从机地址寄存				
			end	
		end
		st_addr_wr 	:	begin 							//发送起始信号设备地址加写标志
			cnt <= cnt + 1'b1;
				case(cnt)
				1 :sio_d_out 	<=  1'b0;				
				3 :sio_c 		<=  1'b0; 
				4 :sio_d_out 	<=  SLAVE_ADDR_reg[6];
				5 :sio_c 		<=  1'b1;
				7 :sio_c		<=  1'b0;
				8 :sio_d_out 	<=  SLAVE_ADDR_reg[5];
				9 :sio_c 		<=  1'b1;
				11:sio_c 		<=  1'b0;
				12:sio_d_out	<=  SLAVE_ADDR_reg[4];
				13:sio_c 		<=  1'b1;
				15:sio_c		<=  1'b0;
				16:sio_d_out 	<=  SLAVE_ADDR_reg[3];
				17:sio_c 		<=  1'b1;
				19:sio_c		<=  1'b0;
				20:sio_d_out 	<=  SLAVE_ADDR_reg[2];
				21:sio_c 		<=  1'b1;
				23:sio_c		<=  1'b0;
				24:sio_d_out 	<=  SLAVE_ADDR_reg[1];
				25:sio_c 		<=  1'b1;
				27:sio_c		<=  1'b0;
				28:sio_d_out 	<=  SLAVE_ADDR_reg[0];
				29:sio_c 		<=  1'b1;
				31:sio_c		<=  1'b0;
				32:sio_d_out 	<=  0;
				33:sio_c 		<=  1'b1;
				35:sio_c		<=  1'b0;
				36:	begin
					sio_d_dir 	<=  1'b0;
					sio_d_out   <=  1'b1;
				end 
				37:sio_c 		<=  1'b1;
				38: begin 					//sccb的应答标志位不在乎
					st_done <= 1'b1;
					//if(sccb_d_in == 1'b1)
				end
				39:	begin 
					sio_c		<=  1'b0;
					cnt 		<= 	'd0;
				end	
				default 	: 	;
				endcase							
		end
		st_addr_16 	:	begin
			cnt <= cnt + 1'b1;
				case(cnt)
				0 :	begin
					sio_d_out 	<=	sccb_addr_reg[15];
					sio_d_dir 	<=  1'b1;
				end					
				1 :sio_c 		<=	1'b1;
				3 :sio_c 	 	<=  1'b0;
				4 :sio_d_out 	<=	sccb_addr_reg[14];
				5 :sio_c 		<=  1'b1;
				7 :sio_c 	 	<=  1'b0;
				8 :sio_d_out 	<=	sccb_addr_reg[13];
				9 :sio_c 		<=	1'b1;
				11:sio_c 	 	<=  1'b0;
				12:sio_d_out 	<=	sccb_addr_reg[12];
				13:sio_c 		<=  1'b1;
				15:sio_c 	 	<=  1'b0;
				16:sio_d_out 	<=	sccb_addr_reg[11];
				17:sio_c 		<=	1'b1;
				19:sio_c 	 	<=  1'b0;
				20:sio_d_out 	<=	sccb_addr_reg[10];
				21:sio_c 		<=  1'b1;
				23:sio_c 	 	<=  1'b0;
				24:sio_d_out 	<=	sccb_addr_reg[9];
				25:sio_c 		<=	1'b1;
				27:sio_c 	 	<=  1'b0;
				28:sio_d_out 	<=	sccb_addr_reg[8];
				29:sio_c 		<=  1'b1;
				31:sio_c 	 	<=  1'b0;
				32:begin
					sio_d_dir <= 1'b0;
					sio_d_out <= 1'b1;
				end
				33:sio_c 		<=	1'b1;
				34:st_done 		<= 	1'b1;
				35:	begin
					sio_c 		<= 	1'b0;
					cnt 		<= 'd0;
				end
										
				default 	: 	;
				endcase							
		end
		st_addr_8 	:	begin
			cnt <= cnt + 1'b1;
				case(cnt)
				0 :	begin
					sio_d_out 	<=	sccb_addr_reg[7];
					sio_d_dir 	<= 	1'b1;
				end 
				1 :sio_c 		<=	1'b1;
				3 :sio_c 	 	<=  1'b0;
				4 :sio_d_out 	<=	sccb_addr_reg[6];
				5 :sio_c 		<=  1'b1;
				7 :sio_c 	 	<=  1'b0;
				8 :sio_d_out 	<=	sccb_addr_reg[5];
				9 :sio_c 		<=	1'b1;
				11:sio_c 	 	<=  1'b0;
				12:sio_d_out 	<=	sccb_addr_reg[4];
				13:sio_c 		<=  1'b1;
				15:sio_c 	 	<=  1'b0;
				16:sio_d_out 	<=	sccb_addr_reg[3];
				17:sio_c 		<=	1'b1;
				19:sio_c 	 	<=  1'b0;
				20:sio_d_out 	<=	sccb_addr_reg[2];
				21:sio_c 		<=  1'b1;
				23:sio_c 	 	<=  1'b0;
				24:sio_d_out 	<=	sccb_addr_reg[1];
				25:sio_c 		<=	1'b1;
				27:sio_c 	 	<=  1'b0;
				28:sio_d_out 	<=	sccb_addr_reg[0];
				29:sio_c 		<=  1'b1;
				31:sio_c 	 	<=  1'b0;
				32:begin
					sio_d_dir <= 1'b0;
					sio_d_out <= 1'b1;
				end
				33:sio_c 		<=	1'b1;
				34:st_done 		<= 	1'b1;
				35:	begin
					sio_c 		<= 	1'b0;
					cnt 		<=  'd0;
				end
										
				default 	: 	;
				endcase							
		end
			st_data_wr 	:	begin
			cnt <= cnt + 1'b1;
				case(cnt)
					0 :begin
						sio_d_out 	<=	sccb_data_wr_reg[7];
						sio_d_dir 	<=  1'b1;
					end 
					1 :sio_c 		<=	1'b1;
					3 :sio_c 	 	<=  1'b0;
					4 :sio_d_out 	<=	sccb_data_wr_reg[6];
					5 :sio_c 		<=  1'b1;
					7 :sio_c 	 	<=  1'b0;
					8 :sio_d_out 	<=	sccb_data_wr_reg[5];
					9 :sio_c 		<=	1'b1;
					11:sio_c 	 	<=  1'b0;
					12:sio_d_out 	<=	sccb_data_wr_reg[4];
					13:sio_c 		<=  1'b1;
					15:sio_c 	 	<=  1'b0;
					16:sio_d_out 	<=	sccb_data_wr_reg[3];
					17:sio_c 		<=	1'b1;
					19:sio_c 	 	<=  1'b0;
					20:sio_d_out 	<=	sccb_data_wr_reg[2];
					21:sio_c 		<=  1'b1;
					23:sio_c 	 	<=  1'b0;
					24:sio_d_out 	<=	sccb_data_wr_reg[1];
					25:sio_c 		<=	1'b1;
					27:sio_c 	 	<=  1'b0;
					28:sio_d_out 	<=	sccb_data_wr_reg[0];
					29:sio_c 		<=  1'b1;
					31:sio_c 	 	<=  1'b0;
					32:begin
						sio_d_dir <= 1'b0;
						sio_d_out <= 1'b1;
					end
					33:sio_c 		<=	1'b1;
					34:st_done 		<= 	1'b1;
					35:	begin
						sio_c 		<= 	1'b0;
						cnt 		<= 	'd0;
					end
											
					default 	: 	;
				endcase							
			end
			st_addr_rd 	:	begin 							//发送结束(0~15)起始(16~18)信号设备地址加读(19)加非应答标志
			cnt <= cnt + 1'b1;
				case(cnt)
					0 :	begin
						sio_d_out 		<= 	1'b0;
						sio_d_dir 		<=  1'b1;
					end						
					1 :sio_c 			<=  1'b1; 
					4 :sio_d_out 		<=  1'b1;
					15: 						;//停止信号发送完毕
					17:sio_d_out 	<=  1'b0;				
					19:sio_c 		<=  1'b0; 
					20:sio_d_out 	<=  SLAVE_ADDR_reg[6];
					21:sio_c 		<=  1'b1;
					23:sio_c		<=  1'b0;
					24:sio_d_out 	<=  SLAVE_ADDR_reg[5];
					25:sio_c 		<=  1'b1;
					27:sio_c 		<=  1'b0;
					28:sio_d_out	<=  SLAVE_ADDR_reg[4];
					29:sio_c 		<=  1'b1;
					31:sio_c		<=  1'b0;
					32:sio_d_out 	<=  SLAVE_ADDR_reg[3];
					33:sio_c 		<=  1'b1;
					35:sio_c		<=  1'b0;
					36:sio_d_out 	<=  SLAVE_ADDR_reg[2];
					37:sio_c 		<=  1'b1;
					39:sio_c		<=  1'b0;
					40:sio_d_out 	<=  SLAVE_ADDR_reg[1];
					41:sio_c 		<=  1'b1;
					43:sio_c		<=  1'b0;
					44:sio_d_out 	<=  SLAVE_ADDR_reg[0];
					45:sio_c 		<=  1'b1;
					47:sio_c		<=  1'b0;
					48:sio_d_out 	<=  1; 		//读
					49:sio_c 		<=  1'b1;
					51:sio_c		<=  1'b0;
					52:	begin
						sio_d_dir 	<=  1'b0;
						sio_d_out   <=  1'b1;
					end 
					53:sio_c 		<=  1'b1;
					54: begin 					//sccb的应答标志位不在乎
						st_done <= 1'b1;
						//if(sccb_d_in == 1'b1)
					end
					55:	begin 
						sio_c		<=  1'b0;
						cnt 		<= 	'd0;
					end	
					default 	: 	;
				endcase							
		end
		st_data_rd 	:	begin 			//读数据
			cnt <= cnt + 1'b1;
				case(cnt)
					0 :begin
						sio_d_out 		<=	1'b1;
						sio_d_dir 		<=  1'b0;	//读状态
					end 
					1 :	begin
						sio_c 			<=	1'b1;
						sccb_data_rd[7]	<=	sio_d;
					end						
					3 :sio_c 			<=  1'b0;
					5 :	begin
						sio_c 			<=	1'b1;
						sccb_data_rd[6]	<=	sio_d;
					end
					7 :sio_c 			<=  1'b0;
					9 :	begin
						sio_c 			<=	1'b1;
						sccb_data_rd[5]	<=	sio_d;
					end
					11:sio_c 			<=  1'b0;
					13:	begin
						sio_c 			<=	1'b1;
						sccb_data_rd[4]	<=	sio_d;
					end
					15:sio_c 			<=  1'b0;
					17:	begin
						sio_c 			<=	1'b1;
						sccb_data_rd[3]	<=	sio_d;
					end
					19:sio_c 			<=  1'b0;
					21:	begin
						sio_c 			<=	1'b1;
						sccb_data_rd[2]	<=	sio_d;
					end
					23:sio_c 			<=  1'b0;
					25:	begin
						sio_c 			<=	1'b1;
						sccb_data_rd[1]	<=	sio_d;
					end
					27:sio_c 			<=  1'b0;
					29:	begin
						sio_c 			<=	1'b1;
						sccb_data_rd[0]	<=	sio_d;
					end
					31:sio_c 	 		<=  1'b0;
					32:begin 						//接收结束
						sio_d_dir <= 1'b1;
						sio_d_out <= 1'b0; 			//主机给非应答
					end
					33:sio_c 		<=	1'b1;
					34:st_done 		<= 	1'b1;
					35:begin
						 sio_c 		<= 	1'b0;
						 cnt		<=  'd0;
					end					
					default 	: 	;
				endcase							
		end			
		st_stop 	:	begin
			cnt 	<=	cnt + 1'b1;
			case(cnt)
				0 :	begin
					sio_d_out 	<= 	1'b0;
					sio_d_dir 	<=	1'b1;
				end
				
				1 :sio_c 		<=	1'b1;
				4 :sio_d_out	<=	1'b1;
				14:	begin
					sccb_done 	<=	1'b1;
					st_done 	<=	1'b1;
				end					
				15:	begin
					cnt 			<=	'd0;
					sccb_done 		<=	'd0;
				end					
				default  :	;
			endcase
		end
		endcase
	end
end
endmodule
  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SCCB协议和IIC协议在写操作方面基本相同,唯一的不同是在SCCB协议中对ACK不关心,而IIC协议中需要接收方返回ACK信号。因此,只需掌握这个不同点,就可以通过在IIC协议上进行简单修改来实现SCCB协议SCCB协议和IIC协议的作用是相同的,都是用于在不同设备之间进行数据通信。它们都是串行通信协议,通过时钟和数据线来传输数据。 在功能方面,SCCB协议允许多个设备共享同一个总线,并且可以支持高速数据传输。而IIC协议在多设备共享总线时需要通过地址选择来进行通信,并且速度相对较慢。 然而,尽管有这些区别,SCCB协议和IIC协议也有一些相同点。它们都是常用的串行通信协议,在许多电子设备中广泛应用。并且它们都可以实现数据的读取和写入操作。[2,3] 总结来说,SCCB协议和IIC协议在写操作方面有一个明显的不同,但在功能和应用方面有一些相似之处。了解这些区别可以帮助我们理解它们的不同用途和适用场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [SCCB协议与IIC协议的对比](https://blog.csdn.net/zhangningning1996/article/details/104145085)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [FPGA中实现SCCB协议](https://download.csdn.net/download/qq_20222919/12736345)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值