Braves starter Tim Hudson (7-7) earned his third straight win after a 10-start winless streak. He pitched 7 1/3 innings, giving up four runs on eight hits while striking out four and walking two. Craig Kimbrell pitched the ninth for his 27th save in 29 outings.
White Sox starter John Danks (2-7) took his seventh loss in his last 10 starts. Danks pitched seven innings, allowing all five Atlanta runs on seven hits, including homers by McCann and Andrelton Simmons. He struck out four and walked none. Danks also uncorked a wild pitch before to McCann's homer.
Atlanta, which ended the first half of the season losing two of its last three, snapped a five-game interleague losing streak to the White Sox.
It was Chicago's eighth loss in its last 11 games, 22 of 31 and 32 of 45. The White Sox are now 19 games under .500 for the first time since Sept. 27, 2007, when they were 70-89.
Atlanta took a 2-0 lead in the third inning. Chris Johnson, who had three hits in the game, led off with a single and scored on Simmons' ninth home run, to left field.
Chicago tied the game in the bottom of the third. Gordon Beckham led off with a single, but was forced at second on a fielder's choice to Josh Phegley. Alexei Ramirez singled, his first of three hits, advancing Phegley to second, and then Alex Rios followed with a two-run double deep to right-center.
The White Sox had a good chance to take the lead in the fifth. Alejandro De Aza and Ramirez had back-to-back one-out singles, putting runners at first and third. Rios' grounder to short was bobbled by Simmons, but he recovered in time to turn an inning-ending double play.
The Braves broke the game open with a three-run sixth. Joey Terdoslavich and Justin Upton both had singles and then advanced to second and third on a wild pitch by Danks. McCann then hit a two-out, 3-2 pitch for his 13th home run, giving the Braves a 5-2 lead.
Chicago scored two runs in the eighth to get within 5-4. De Aza led off with walk and stole second and scored on Ramirez's RBI double to left. Jeff Keppinger's bloop single to right scored Ramirez.
The Braves added an insurance run in the ninth when Upton singled off White Sox reliever Matt Lindstrom, went to second on an infield out and scored on Johnson's single to right.
Before to the game, White Sox RHP Jake Peavy (6-4, 4.30) was activated off the disabled list. He will start Saturday against Braves lefty Paul Maholm (9-8, 3.98).
Peavy had been sidelined since June 5 with a rib he fractured June 4 at Seattle.